Cod sursa(job #947160)

Utilizator BitOneSAlexandru BitOne Data 6 mai 2013 20:18:12
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <string>
#include <vector>
#include <limits>
#include <cstdlib>
#include <fstream>
#include <iterator>
#include <algorithm>


using namespace std;

const int NMAX = 2000011;
const int MODULO1 = numeric_limits<int>::max();
const int MODULO2 = 1073741827;
const int ALPHA = 31;
const int BETA  = 7;

vector<int> match;
string pattern, txt;

void RabinKarp()
{
    int N, M, patternH1, patternH2, txtH1, txtH2, AlphaN, BetaN, i;

    N = txt.size();
    M = pattern.size();
    AlphaN = BetaN = 1;
    patternH1 = patternH2 = txtH1 = txtH2 = 0;
    for(i = 0; i < M; ++i)
    {
        patternH1 = (1LL * patternH1 * ALPHA + pattern[i]) % MODULO1;
        patternH2 = (1LL * patternH2 * BETA + pattern[i]) % MODULO2;
        txtH1 = (1LL * txtH1 * ALPHA + txt[i]) % MODULO1;
        txtH2 = (1LL * txtH2 * BETA + txt[i]) % MODULO2;
        AlphaN = (1LL * AlphaN * ALPHA) % MODULO1;
        BetaN = (1LL * BetaN * BETA) % MODULO2;
    }
    match.reserve(N);
    if(patternH1 == txtH1 && patternH2 == txtH2) match.push_back(0);
    for(; i < N; ++i)
    {
        txtH1 = ((1LL * txtH1 * ALPHA - 1LL * txt[i - M] * AlphaN) % MODULO1 + MODULO1 + txt[i]) % MODULO1;
        txtH2 = ((1LL * txtH2 * BETA - 1LL * txt[i - M] * BetaN) % MODULO2 + MODULO2 + txt[i]) % MODULO2;
        if(patternH1 == txtH1 && patternH2 == txtH2) match.push_back(i - M + 1);
    }
}
int main()
{
    ifstream in("strmatch.in");
    ofstream out("strmatch.out");

    getline(in, pattern);
    getline(in, txt);
    RabinKarp();

    out << match.size() << '\n';
    copy(match.begin(), match.begin() + min((size_t)1000, match.size()), ostream_iterator<int>(out, " "));
    return EXIT_SUCCESS;
}