Pagini recente » Cod sursa (job #2133271) | Cod sursa (job #700027) | Cod sursa (job #1772001) | Cod sursa (job #2306558) | Cod sursa (job #2684872)
//Rabin-Karp
#include <iostream>
#include <fstream>
#include <cstring>
#define NMAX 2000002
using namespace std;
ifstream fin ("strmatch.in");
ofstream fout ("strmatch.out");
char a[NMAX], b[NMAX];
int afis[NMAX];
long long putere(long long x, long long e)
{
if(e==0) return 1;
if(e%2==0) return putere(x*x, e/2);
return x*putere(x*x, e/2);
}
int main()
{
long long n, m, i, pow, ha=0, hb=0;
int nr_afis=0;
const long long bz=122;
fin.getline(a, NMAX); n=strlen(a);
fin.getline(b, NMAX); m=strlen(b);
for(i=0; i<n; i++)
{
hb=hb*bz+b[i];
ha=ha*bz+a[i];
}
pow=putere(bz, n-1);
//sau
if(ha==hb) afis[++nr_afis]=0; //incepand cu pozitia 0
for(i=n; i<m; i++)
{
hb=(hb-b[i-n] * pow)*bz+b[i];
//sau h=h % pow * pow+b[i];
if(ha==hb) afis[++nr_afis]=i-n+1;
}
fout<<nr_afis<<"\n";
for(i=1; i<=min(nr_afis, 1000); i++) fout<<afis[i]<<' ';
}