Pagini recente » Cod sursa (job #1225675) | Cod sursa (job #658181) | Cod sursa (job #531741) | Cod sursa (job #1422724) | Cod sursa (job #1508633)
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char s[2000010],p[2000010];
int pref[2000010],pozitie[2000010];
int k=0;
void pattern(int lp)
{
int i,j;
pref[0]=0;
i=1;
j=0;
while(i<lp)
if(p[i]==p[j])
{
pref[i]=j+1;
i++,j++;
}
else if(j==0)
pref[i++]=0;
else
j=pref[j-1];
}
int nrap;
int strmatch(int ls,int lp)
{
int i=0,j=0;
while(i<ls)
if(s[i]==p[j])
{
i++;
j++;
if(j==lp)
{
nrap++;
pozitie[++k]=i-lp;
j=pref[j-1];
}
}
else if(j==0)
i++;
else
j=pref[j-1];
return nrap;
}
int main()
{
FILE *f=fopen("strmatch.in","r");
fscanf(f,"%s\n%s",p,s);
int ls=strlen(s);
int lp=strlen(p);
pattern(lp);
f=fopen("strmatch.out","w");
fprintf(f,"%d\n",strmatch(ls,lp));
if(k>1000)
k=1000;
for(int i=1; i<=k; i++)
fprintf(f,"%d ",pozitie[i]);
return 0;
}