Pagini recente » Cod sursa (job #162188) | Cod sursa (job #1776345) | Cod sursa (job #1727168) | Cod sursa (job #1071888) | Cod sursa (job #2703729)
#include <bits/stdc++.h>
#define MOD1 100007
#define MOD2 100021
using namespace std;
ifstream f ("strmatch.in");
ofstream g ("strmatch.out");
char s[2000000];
char a[2000000];
int HASH1a,HASH2a;
int hash1s,hash2s;
int n,m;
int match[100005];
int cont;
const int baza=73;
int p1=1,p2=1;
int main()
{
f>>a;
f>>s;
int n=strlen(s);
int m=strlen(a);
for(int i=0; i<m; ++i)
{
hash1s*=baza;
hash2s*=baza;
hash1s+=a[i];
hash2s+=a[i];
hash1s=hash1s%MOD1;
hash2s=hash2s%MOD2;
if(i!=0)
{
p1*=baza;
p1=p1%MOD1;
p2*=baza;
p2=p2%MOD1;
}
}
cout<<hash1s<<" "<<hash2s<<"\n";
for(int i=0; i<m; ++i)
{
HASH1a*=baza;
HASH2a*=baza;
HASH1a+=s[i];
HASH2a+=s[i];
HASH1a=HASH1a%MOD1;
HASH2a=HASH2a%MOD2;
}
if(hash1s==HASH1a && hash2s==HASH2a)
{
match[0]=1;
++cont;
}
for(int i=m; i<n; ++i)
{
cout<<HASH1a<<" "<<HASH2a<<"\n";
HASH1a = ((HASH1a - (s[i-m] * p1) % MOD1+ MOD1)* baza + s[i]) % MOD1;
HASH2a = ((HASH2a - (s[i-m] * p2) % MOD2 + MOD2) * baza + s[i]) % MOD2;
if (HASH1a == hash1s && HASH2a == hash2s)
match[ i - m + 1 ] = 1, cont++;
}
g<<cont<<"\n";
for(int i=1; i<=n; ++i)
if(match[i])
g<<i<<" ";
return 0;
}