Cod sursa(job #348307)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 15 septembrie 2009 11:02:12
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>
#define P 1<<21
char M[P],N[P];
int m,n,pi[P],sol;
inline int lit(char x)
{
	return (x>='A' && x<='Z') || (x>='a' && x<='z');
}
void calc_prefix()//cel mai lung prefix care e si sufix pt sirul N
{
	int k=0,i;
	for (i=2; i<=n; i++)
	{
		while (k>0 && N[k+1]!=N[i])k=pi[k];
	/*"trec la configuratiile anterioare de prefixe 
	care sunt si sufixe" si gasesc o potrivire*/
		if (N[k+1]==N[i])k++;//"potrivire cu configuratia anterioara"
		pi[i]=k;
	}
}
void kmp()
{
	int i,q=0;
	for (i=1; i<=m; i++)
	{
		while  (q>0 && N[q+1] != M[i]) q=pi[q];
		if ( N[q+1] == M[i]) q++;
		if ( q == n)
		{
			sol++;
			if (sol<=1000)
				printf("%d ",i-n);
			else
				return;
		}
	}
}
int main()
{
	freopen("strmatch.in","r",stdin);
	freopen("strmatch.out","w",stdout);
	fgets(N+1,P,stdin);
	while (lit(N[n+1])) n++;
	fgets(M+1,P,stdin);
	while (lit(M[m+1])) m++;
	calc_prefix();
	kmp();
	return 0;
}