Pagini recente » Cod sursa (job #2102253) | Cod sursa (job #933061) | Cod sursa (job #1879453) | Cod sursa (job #757311) | Cod sursa (job #348307)
Cod sursa(job #348307)
#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;
}