Pagini recente » Cod sursa (job #1502180) | Cod sursa (job #2308378) | Cod sursa (job #14328) | Cod sursa (job #1789741) | Cod sursa (job #1462635)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
char pattern[2000001],str[2000001];
bool sol[2000001];
int nr=0;
int main()
{
ifstream in("strmatch.in");
ofstream out("strmatch.out");
in >> pattern >> str;
int np=strlen(pattern),ns=strlen(str);
int hashp1=0,hashp2=0,hash1=0,hash2=0,mod1=666013,mod2=100019,p=73,p1=1,p2=1;
for(int i=0;i<np;i++)
{
hashp1=(hashp1*p+pattern[i])%mod1;
hashp2=(hashp2*p+pattern[i])%mod2;
if(i!=0)
{
p1=(p1*p)%mod1;
p2=(p2*p)%mod2;
}
}
for(int i=0;i<np;i++)
{
hash1=(hash1*p+str[i])%mod1;
hash2=(hash2*p+str[i])%mod2;
}
if(hash1==hashp1 && hash2==hashp2)
sol[0]=1,nr++;
for(int i=np;i<ns;i++)
{
hash1=((hash1-(str[i-np]*p1)%mod1+mod1)*p+str[i])%mod1;
hash2=((hash2-(str[i-np]*p2)%mod2+mod2)*p+str[i])%mod2;
//cout << hash1 << " " <<hashp1 << endl;
if(hash1==hashp1 && hash2==hashp2)
{
nr++;
sol[i-np+1]=1;
}
}
out << nr << "\n";
nr=0;
for(int i=0;i<2000001 && nr<1000;i++)
{
if(sol[i]) {nr++; out << i << " ";}
}
}