Pagini recente » Cod sursa (job #2120348) | Cod sursa (job #857459) | Cod sursa (job #2125115) | Cod sursa (job #655488) | Cod sursa (job #2284461)
#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;
if(i)
power=(power*n)%m;
}
}
void roll(char toremove, char toadd)
{
hash=(((hash-toremove*power+m)*n)%m+toadd)%m;
}
};
int main()
{
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
int n,m;
char p[2000001],t[2000001];
int 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);
int nr=0;
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<<nr<<"\n";
for(int i=0;i<k;i++)
fout<<poz[i]<<" ";
return 0;
}