Pagini recente » Cod sursa (job #1251707) | Cod sursa (job #212884) | Cod sursa (job #763654) | Cod sursa (job #518130) | Cod sursa (job #975768)
Cod sursa(job #975768)
#include <iostream>
#include <fstream>
#include <cstring>
#define KEY1 100007
#define KEY2 100021
#define DN 2000001
using namespace std;
char x[DN],y[DN];
int rez[1005];
int main()
{
int p=73,n,m;
int pattern_hash1=0,pattern_hash2=0,string_hash1=0,string_hash2=0,p1=1,p2=1;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
f>>x>>y;
n=strlen(x);
m=strlen(y);
for(int i=0;i<n;++i)
{
pattern_hash1=(pattern_hash1*p + x[i])%KEY1;
pattern_hash2=(pattern_hash2*p + x[i])%KEY2;
if(i)
p1=(p1*p)%KEY1,
p2=(p2*p)%KEY2;
}
for(int i=0;i<n;++i)
string_hash1=( string_hash1*p + y[i] ) % KEY1,
string_hash2=( string_hash2*p + y[i] ) % KEY2;
if(string_hash1==pattern_hash1 && string_hash2==pattern_hash2)
rez[++rez[0]]=0;
for(int i=n;i<m;++i)
{
string_hash1=((string_hash1 - (y[i-n]*p1)%KEY1 + KEY1 )*p +y[i])%KEY1;
string_hash2=((string_hash2 - (y[i-n]*p2)%KEY2 + KEY2 )*p +y[i])%KEY2;
if(string_hash1==pattern_hash1 && string_hash2==pattern_hash2)
{
if(sz<1000)
rez[++sz]=i-n+1;
else
++sz;
}
}
g<<sz<<"\n";
for(int i=1;i<=1000;++i)
g<<rez[i]<<" ";
return 0;
}