Pagini recente » Cod sursa (job #1938840) | Cod sursa (job #1289253) | Cod sursa (job #111792) | Cod sursa (job #860848) | Cod sursa (job #169741)
Cod sursa(job #169741)
#include<stdio.h>
#include<string.h>
FILE*fin=fopen("strmatch.in","r");
FILE*fout=fopen("strmatch.out","w");
#define maxn 2000001
int nrp=0,n,m,p[1001],sup[maxn];
char s[maxn],t[maxn];
void prefix()
{
int k=0,i;
sup[1]=0;
for(i=2;i<=m;i++)
{
while(k>0&&s[k]!=s[i-1]) k=sup[k];
if(s[k]==s[i-1]) k++;
sup[i]=k;
}
}
void kmp()
{
int k=0,i;
for(i=1;i<=n;i++)
{
while(k>0&&s[k]!=t[i-1]) k=sup[k];
if(s[k]==t[i-1]) k++;
if(k==m)
{
nrp++;
p[nrp]=i-m;
k=sup[k];
if(nrp==1000) return ;
}
}
}
int main()
{
int i;
fscanf(fin,"%s",&s);
fscanf(fin,"%s",&t);
n=strlen(t);
m=strlen(s);
nrp=0;
fclose(fin);
prefix();
kmp();
for(i=1;i<=nrp;i++)
fprintf(fout,"%d\n",p[i]);
fclose(fout);
return 0;
}