Pagini recente » Cod sursa (job #2772277) | Cod sursa (job #522808) | Cod sursa (job #1300435) | Cod sursa (job #2934286) | Cod sursa (job #1076218)
#include<fstream>
#include<cstring>
#include<iostream>
#define mod1 500907
#define mod2 300021
#define mod3 134531
using namespace std;
char a[2000002],b[2000002];
long n,m,i,v[1001],nr;
long ha1,ha2,hb1,hb2,ha3,hb3;
long h1=1,h2=1,h3=1;
int main()
{
ifstream f("strmatch.in");
ofstream g("strmatch.out");
f>>a;
f>>b;
m=strlen(a);
n=strlen(b);
for(i=0;i<m;i++)
{
ha1=(ha1*13+a[i])%mod1;
hb1=(hb1*13+b[i])%mod1;
ha2=(ha2*13+a[i])%mod2;
hb2=(hb2*13+b[i])%mod2;
ha3=(ha3*13+a[i])%mod3;
hb3=(hb3*13+b[i])%mod3;
if(i)
{h1=(h1*13)%mod1;
h2=(h2*13)%mod2;
h3=(h3*13)%mod3;}
}
for(i=0;i<=n-m;i++)
{
if(ha1==hb1&&ha2==hb2&&ha3==hb3)
{
nr++;
if(nr<=1000) v[nr]=i;
}
hb1=(13*(hb1-(b[i]*h1)%mod1+mod1)+b[i+m])%mod1;
hb2=(13*(hb2-(b[i]*h2)%mod2+mod2)+b[i+m])%mod2;
hb3=(13*(hb3-(b[i]*h3)%mod3+mod3)+b[i+m])%mod3;
}
g<<nr<<'\n';
for(i=1;i<=nr && i<=1000;i++)
g<<v[i]<<'\n';
}