Pagini recente » Cod sursa (job #2214641) | Cod sursa (job #2332484) | Cod sursa (job #1168951) | Cod sursa (job #1291919) | Cod sursa (job #2088985)
#include <cstdio>
#include <cstring>
#define n1 2000003
#define n2 2000029
using namespace std;
char p[2000010],s[2000010];
int n,m,p256n1,p256n2,h1p,h2p,h1s,h2s,match=0,poz[1010];
void calcul_h(char *p,int &h1p,int &h2p,int &p256n1,int &p256n2)
{
int i;
p256n1=1;p256n2=1;
for(i=0;i<n;i++)
{
p256n1=(p256n1*256)%n1;p256n2=(p256n2*256)%n2;
h1p=(h1p*256+p[i])%n1;h2p=(h2p*256+p[i])%n2;
}
}
int main()
{
FILE *f=fopen("strmatch.in","r");
fgets(p,2000010,f);n=strlen(p);
if(p[n-1]=='\n')p[--n]=0;
fgets(s,2000010,f);m=strlen(s);
if(s[m-1]=='\n')s[--m]=0;
calcul_h(p,h1p,h2p,p256n1,p256n2);
calcul_h(s,h1s,h2s,p256n1,p256n2);
int i;
for(i=n-1;i<m;i++)
{
if(h1p==h1s&&h2p==h2s)
{
match++;
if(match<=1000)poz[match]=i+1-n;
}
h1s=((h1s*256)%n1-(s[i+1-n]*p256n1)%n1+s[i+1]%n1)%n1;
h1s=(n1+h1s)%n1;
h2s=((h2s*256)%n2-(s[i+1-n]*p256n2)%n2+s[i+1]%n2)%n2;
h2s=(n2+h2s)%n2;
}
fclose(f);
f=fopen("strmatch.out","w");
fprintf(f,"%d\n",match);
if(match>1000)match=1000;
for(i=1;i<=match;i++)fprintf(f,"%d ",poz[i]);
return 0;
}