Pagini recente » Cod sursa (job #377346) | Cod sursa (job #743207) | Cod sursa (job #1505184) | Cod sursa (job #2368841) | Cod sursa (job #2084427)
#include <cstdio>
#include <cstring>
char a[2000010],b[2000010];
int pbase1=2000003,pbase2=2000029,match[1010];
int main()
{
FILE *f=fopen("strmatch.in","r");
fgets(a,2000010,f);
fgets(b,2000010,f);
int n=strlen(a),m=strlen(b);
if(a[n-1]=='\n')a[--n]=0;
if(b[m-1]=='\n')b[--m]=0;
int i,ha1=0,ha2=0,hb1=0,hb2=0,p256_1=1,p256_2=1;
for(i=0; a[i]; ++i)
{
p256_1=p256_1*256%pbase1;
ha1=(ha1*256+a[i])%pbase1;
hb1=(hb1*256+b[i])%pbase1;
p256_2=p256_2*256%pbase2;
ha2=(ha2*256+a[i])%pbase2;
hb2=(hb2*256+b[i])%pbase2;
}
int ok,j,nrap=0,q=m-n;
for(i=0; i<=q; ++i)
{
if(ha1==hb1&&ha2==hb2)
{
nrap++;
if(nrap<=1000)match[nrap]=i;
}
hb1=((hb1*256-b[i]*p256_1+b[i+n])%pbase1+pbase1)%pbase1;
hb2=((hb2*256-b[i]*p256_2+b[i+n])%pbase2+pbase2)%pbase2;
}
f=fopen("strmatch.out","w");
fprintf(f,"%d\n",nrap);
if(nrap>1000)nrap=1000;
for(i=1; i<=nrap; ++i)fprintf(f,"%d ",match[i]);
return 0;
}