Cod sursa(job #2684872)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 15 decembrie 2020 01:36:58
Problema Potrivirea sirurilor Scor 18
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
//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]<<' ';
}