Pagini recente » Cod sursa (job #97031) | Cod sursa (job #843958) | Cod sursa (job #951114) | Cod sursa (job #1291947) | Cod sursa (job #1550157)
#include <fstream>
#include <string.h>
#define d 67
#define m1 100007
#define m2 100021
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
char sir1[2000001],sir2[2000001];
int m,n;
char v[2000001];
int main()
{
int i,a1,a2,p1,p2,Max=2000001;
fin.getline(sir1,2000001);
fin.getline(sir2,2000001);
m=strlen(sir1);
n=strlen(sir2);
a1=a2=0;
p1=p2=0;
for (i=0;i<m;i++)
{
a1=(a1*d+sir1[i])%m1;
a2=(a2*d+sir1[i])%m2;
if (i!=0)
p1=(p1*d)%m1,
p2=(p2*d)%m2;
}
if (m>n)
{
fout<<0;
return 0;
}
int b1=0,b2=0;
for (i=0;i<m;i++)
b1=(b1*d+sir2[i])%m1,
b2=(b2*d+sir2[i])%m2;
int Nr=0;
if (a1==b1&&a2==b2)
v[0]=1,Nr++;
for (i=m;i<n;i++)
{
b1=((b1-(sir2[i-m]*p1)%m1+m1)*d+sir2[i])%m1;
b2=((b2-(sir2[i-m]*p2)%m2+m2)*d+sir2[i])%m2;
if (b1==a1&&b2==a2)
v[i-m+1]=1,Nr++;
}
fout<<Nr;
Nr=0;
for (i=0;i<n&&Nr<1000;i++)
if (v[i])
Nr++,
fout<<i;
fout<<'\n';
return 0;
}