Pagini recente » Cod sursa (job #545181) | Cod sursa (job #2409415) | Cod sursa (job #3136415) | Romanii medaliati la IOI | Cod sursa (job #2089008)
#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,poz[1005];
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()
{
int i;
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);
for(i=n-1;i<m;++i)
{
if(h1p==h2p&&h1s==h2s)
{
match++;
if(match<=1000)
poz[match]=i+1-n;
}
h1s=((h1s*256)%n1-(s[i+1-n]*p256n1)%n1+s[i+1])%n1;
h1s=(n1+h1s)%n1;
h2s=((h2s*256)%n2-(s[i+1-n]*p256n2)%n2+s[i+1])%n2;
h1s=(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;
}