Pagini recente » Cod sursa (job #1609580) | Cod sursa (job #1263115) | Cod sursa (job #2334578) | Cod sursa (job #397604) | Cod sursa (job #1481431)
#include <fstream>
#include <cstring>
#define nmax 2000050
#define orice 661
#define mod 666013
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
char A[nmax], B[nmax], x;
int hasha, hashb, La, Lb, nrAparitii, v[nmax], p = 1;
void Hashing(char x[nmax], int &Hash){
for(int i = 0; i < Lb; ++i){
Hash = ( (Hash * orice) % mod + (unsigned)x[i] ) % mod;
}
}
void Hash2(int a){
hasha = (hasha * orice) % mod;
hasha = ( ( hasha - ( ( unsigned ) A[a - 1] * p % mod ) ) + mod ) % mod;
hasha = ( hasha + (unsigned)A[a + Lb - 1] + mod ) % mod;
}
int main()
{int i;
f>>B>>A;
La = strlen(A);
Lb = strlen(B);
if(Lb > La){
g<<0<<'\n';
return 0;
}
for(i = 1; i <= Lb; ++ i)
p = (p * orice) % mod;
Hashing(B, hashb);
Hashing(A, hasha);
if(hasha == hashb)
v[++nrAparitii] = 0;
x = La - Lb;
for(i = 1; i <= x; ++i){
Hash2(i);
// g<<hasha<<' '<<hashb<<'\n';
if(hasha == hashb){
v[++nrAparitii] = i;
}
}
g<<nrAparitii<<'\n';
for(i = 1; i <= min(nrAparitii, 1000); ++i)
g<<v[i]<<' ';
g<<'\n';
return 0;
}