Cod sursa(job #1976487)

Utilizator MaligMamaliga cu smantana Malig Data 3 mai 2017 15:49:06
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <stack>

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

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

int N,M;
char patt[NMax],str[NMax];

vector<int> sol;

int main() {
    in>>(patt+1)>>(str+1);
    N = strlen(patt+1);
    M = strlen(str+1);

    int pattHash1,pattHash2,strHash1,strHash2, pw1 = 1, pw2 = 1;
    pattHash1 = pattHash2 = strHash1 = strHash2 = 0;
    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 (strHash1 == pattHash1 && strHash2 == pattHash2) {
        sol.pb(0);
    }

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

        if (strHash1 == pattHash1 && strHash2 == pattHash2) {
            sol.pb(i-N);
        }
    }

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

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