Pagini recente » Cod sursa (job #2834211) | Cod sursa (job #1063587) | Cod sursa (job #1709818) | Cod sursa (job #1983941) | Cod sursa (job #1867474)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
#define MOD1 10003
#define MOD2 9973
int m,n,v1,v2,p,r,i,h1,h2,nr,a[1005];
char s1[2000005],s2[2000005],x;
int main()
{
f.getline(s1,2000005);
m=strlen(s1);
f.getline(s2,2000005);
n=strlen(s2);
v1=0;
v2=0;
for(i=0;i<m;i++)
{v1=(v1*59+(int)s1[i])%MOD1;
v2=(v2*61+(int)s1[i])%MOD2;
}
p=1; r=1;
for(i=0;i<m-1;i++)
{
p=p*59%MOD1;
r=r*61%MOD2;
}
for(i=0;i<m;i++)
{
h1=(h1*59+(int)s2[i])%MOD1;
h2=(h2*61+(int)s2[i])%MOD2;
}
if(v1==h1 && v2==h2){nr++; a[nr]=i-m+1;}
for(i=m;i<n;i++)
{
h1 = ( (h1 - (s2[ i - m]*p)% MOD1 + MOD1)*59 + s2[i])%MOD1;
h2 = ( (h2 - (s2[ i - m]*r)% MOD2 + MOD2)*61 + s2[i])%MOD2;
if (v1==h1 && v2==h2)
if(nr<1000)
{nr++; a[nr]=i+1-m;}
else nr++;
}
g<<nr<<'\n';
if(nr>1000)nr=1000;
for(i=1;i<=nr;i++)
g<<a[i]<<" ";
return 0;
}