Pagini recente » Cod sursa (job #277550) | Cod sursa (job #2018265) | Cod sursa (job #2616232) | Istoria paginii utilizator/hsmhaos | Cod sursa (job #2284614)
#include <fstream>
#include <string.h>
using namespace std;
char a[2000001], b[200001];
int la, lb;
int ha1, ha2, put1, put2;
char match[2000001];
int main()
{
ifstream f("strmatch.in");
ofstream g("strmatch.out");
f.getline(a, 2000000);
f.getline(b, 2000000);
la=strlen(a);
lb=strlen(b);
put1=put2 = 1;
ha1=ha2 = 0;
for(int i=0; i<la; i++)
{
ha1=(ha1*73+a[i])%100007;
ha2=(ha2*73+a[i])%100021;
if(i!=0)
put1=(put1*73)%100007, put2=(put2*73)%100021;
}
if(la>lb)
{
g<<0<<endl;
return 0;
}
int h1=0, h2=0;
for(int i=0; i<la; i++)
h1=(h1*73+b[i])%100007, h2=(h2*73+b[i])%100021;
int nr=0;
if(h1==ha1&&h2==ha2)
match[0]=1, nr++;
for(int i=la; i<lb; i++)
{
h1=((h1-(b[i-la]*put1)%100007+100007)*73+b[i])%100007;
h2=((h2-(b[i-la]*put2)%100021+100021)*73+b[i])%100021;
if (h1==ha1&&h2==ha2)
match[i-la+1]=1, nr++;
}
g<<nr;
for(int i=0; i<lb&&nr<1000; i++)
if (match[i])
{
g<<i+1<<' ';
}
return 0;
}