Cod sursa(job #2015448)

Utilizator MaligMamaliga cu smantana Malig Data 26 august 2017 10:07:55
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
#include <deque>
#include <cstring>

#define ll long long
using namespace std;
const int inf = 3e4 + 5;
const int NMax = 2e6 + 5;
const int mod1 = 100003;
const int mod2 = 100007;
const int base = 73;

ifstream in("strmatch.in");
ofstream out("strmatch.out");

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

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

    int pattHash1 = 0,strHash1 = 0;
    int pattHash2 = 0,strHash2 = 0;
    int pw1 = 1,pw2 = 1;
    for (int i=0;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;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+1;
        }
    }

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

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