Cod sursa(job #1874041)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 9 februarie 2017 17:22:22
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#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;
}