Cod sursa(job #613590)

Utilizator sebii_cSebastian Claici sebii_c Data 1 octombrie 2011 13:10:04
Problema Potrivirea sirurilor Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 0.84 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMAX 2000005

int N, M;
char A[NMAX],B[NMAX];
int pi[NMAX], pos[1024];

void calcul_prefix() 
{
	int k = 0;
	int i;
	pi[1] = 0;
	for (i=2; i<=N; ++i) {
		while ((k > 0) && (A[k+1] != A[i])) 
			k = pi[k];
		if (A[k+1] == A[i])
			++k;
		pi[i] = k;
	}
}

int main()
{
	int i, q = 0, k = 0;
	scanf("%s", A); scanf("%s", B);
	N = strlen(A); M = strlen(B);
	
	for (i=N; i>0; --i)
		A[i] = A[i-1];
	A[0] = ' ';
	for (i=M; i>0; --i)
		B[i] = B[i-1];
	B[0] = ' ';
	
	calcul_prefix();
	
	for (i=1; i<=M; ++i) {
		while ((q>0) && (A[q+1] != B[i]))
			q = pi[q];
		if (A[q+1] == B[i])
			++q;
		if (k > 1000)
			break;
		if (q == N) {
			pos[k] = i-N;
			k++;
		}
	}
	
	for (i=0; i<k; ++i)
		printf("%d ", pos[i]);
	printf("\n");
	
	return 0;
}