Pagini recente » Cod sursa (job #2163375) | Cod sursa (job #4442) | Cod sursa (job #1678997) | Cod sursa (job #1259610) | Cod sursa (job #1874041)
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
// algoritmul Rabin-Karp cu verificare
const int NMax = 2000000 + 3;
const int mod1 = 100007;
const int base = 73;
// base = baza pentru functia rolling hash Rabin fingerprint
int nrSol;
char a[NMax],b[NMax];
bool sol[NMax];
bool isSame(char*,char*,int);
int main() {
f.getline(a+1,NMax);
f.getline(b+1,NMax);
int nrA,nrB;
nrA = strlen(a+1);
nrB = strlen(b+1);
if (nrA>nrB) {
g<<0;
return 0;
}
int hashA1=0,pw1=1;
for (int i=1;i<=nrA;++i) {
hashA1 = (hashA1 * base + a[i]) % mod1;
if (i!=1) {
pw1 = (pw1*base) % mod1;
}
}
int hashB1=0;
for (int i=1;i<=nrA;++i) {
hashB1 = (hashB1 * base + b[i]) % mod1;
}
if (hashA1 == hashB1 && isSame(a,b,nrA)) {
++nrSol;
sol[1]=true;
}
for (int i=nrA+1;i<=nrB;++i) {
//hashB1 = (hashB1 - b[i-nrA]*pw1) * base + b[i];
hashB1 = ((hashB1 - (b[i-nrA]*pw1)%mod1 + mod1) * base + b[i]) % mod1;
if (hashA1 == hashB1 && isSame(a,b+i-nrA,nrA)) {
sol[i-nrA+1]=true;
++nrSol;
}
}
g<<nrSol<<'\n';
nrSol=0;
for (int i=1;i<=nrB-nrA+1 && nrSol<1000;++i) {
if (sol[i]) {
g<<i-1<<' ';
++nrSol;
}
}
f.close();g.close();
return 0;
}
bool isSame(char f[],char s[],int nr) {
for (int i=1;i<=nr;++i) {
if (f[i]!=s[i]) {
return false;
}
}
return true;
}