Cod sursa(job #1968096)

Utilizator MaligMamaliga cu smantana Malig Data 17 aprilie 2017 14:31:21
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");

#define pb push_back
typedef long long ll;
const int NMax = 2e6 + 5;
const ll base = 73;
const ll mod1 = 100003;
const ll mod2 = 100007;

int nrSol;
char str[NMax],patt[NMax];
int sol[NMax];

int main() {
    in>>(patt+1);
    in>>(str+1);

    ll N = strlen(patt+1),M = strlen(str+1),
        pattHash1 = 0,pattHash2 = 0,strHash1 = 0,strHash2 = 0,pw1 = 1,pw2 = 1;

    for (int i=1;i <= N;++i) {
        pattHash1 = (pattHash1 * base + patt[i] * base) % mod1;
        pattHash2 = (pattHash2 * base + patt[i] * base) % mod2;

        strHash1 = (strHash1 * base + str[i] * base) % mod1;
        strHash2 = (strHash2 * base + str[i] * base) % mod2;

        pw1 = (pw1 * base) % mod1;
        pw2 = (pw2 * base) % mod2;
    }

    if (pattHash1 == strHash1 && pattHash2 == strHash2) {
        sol[++nrSol] = 0;
    }

    for (int i=N+1;i <= M;++i) {
        strHash1 = ((strHash1 - (str[i-N] * pw1) % mod1 + mod1) * base + str[i]*base) % mod1;
        strHash2 = ((strHash2 - (str[i-N] * pw2) % mod2 + mod2) * base + str[i]*base) % mod2;

        if (pattHash1 == strHash1 && pattHash2 == strHash2) {
            sol[++nrSol] = i-N;
        }
    }

    out<<nrSol<<'\n';
    int lim = (1000 < nrSol) ? 1000 : nrSol;
    for (int i=1;i<=lim;++i) {
        out<<sol[i]<<' ';
    }

    in.close();out.close();
    return 0;
}