Pagini recente » Cod sursa (job #3262016) | Cod sursa (job #2807258) | Cod sursa (job #1917620) | Cod sursa (job #1595264) | Cod sursa (job #2284501)
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
struct Hash
{
int n,m,power,hash;
void init(char *s, int len)
{
power=1,hash=0;
for(int i=len-1;i>=0;i--)
{
hash=(hash+(1LL*power*s[i])%m)%m;
if(i)
power=(power*n)%m;
}
}
void roll(char toremove, char toadd)
{
hash=(((hash-(1LL*toremove*power)%m+m)*n)%m+toadd)%m;
}
};
int main()
{
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
int n,m;
char p[2000001],t[2000001];
long long poz[2000001],k=0;
fin>>p>>t;
n=strlen(p);
m=strlen(t);
Hash pHash{3,666013},tHash{3,666013};
Hash pHash2{5,765465},tHash2{5,765465};
pHash.init(p,n);
tHash.init(t,n);
pHash2.init(p,n);
tHash2.init(t,n);
if(pHash.hash==tHash.hash&&pHash2.hash==tHash2.hash)
{
poz[k++]=0;
}
for(int i=n;i<m;i++)
{
tHash.roll(t[i-n],t[i]);
tHash2.roll(t[i-n],t[i]);
if(pHash.hash==tHash.hash&&pHash2.hash==tHash2.hash)
{
if(k<=1000)
poz[k++]=i-n+1;
else k++;
}
}
if(k>=1000)
k=1000;
fout<<k<<"\n";
for(int i=0;i<k;i++)
fout<<poz[i]<<" ";
return 0;
}