Cod sursa(job #947160)
#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;
}