Cod sursa(job #923383)
#include <fstream>
#include <cstring>
using namespace std;
static const int MAXN = 2000001, MAXA = 1000, MOD1 = 666013, MOD2 = 1000037;
char T[MAXN], P[MAXN];
int A[MAXA], kt;
int pre(char s[], int l, int r, int MOD) {
int ans = 0;
for(int i = l; i < r; i++) {
ans = (ans * 256 + s[i]) % MOD;
}
return ans;
}
int main() {
int ans = 0, lP, lT, put1 = 1, put2 = 1;
ifstream f("strmatch.in");
f >> P >> T;
f.close();
lP = strlen(P);
lT = strlen(T);
int p1 = pre(P, 0, lP, MOD1);
int t1 = pre(T, 0, lP - 1, MOD1);
int p2 = pre(P, 0, lP, MOD2);
int t2 = pre(T, 0, lP - 1, MOD2);
for(int i = 1; i < lP; i++) {
put1 = (put1 * 256) % MOD1;
put2 = (put2 * 256) % MOD2;
}
for(int i = lP - 1; i < lT; i++) {
t1 = (t1 * 256 + T[i]) % MOD1;
t2 = (t2 * 256 + T[i]) % MOD2;
if(p1 == t1 && p2 == t2) {
if(kt < 1000) A[kt++] = i - lP + 1;
ans++;
}
t1 = ((t1 - T[i - lP + 1] * put1) % MOD1 + MOD1) % MOD1;
t2 = ((t2 - T[i - lP + 1] * put2) % MOD2 + MOD2) % MOD2;
}
ofstream g("strmatch.out");
g << ans << endl;
for(int i = 0; i < kt; i++) {
g << A[i] << ' ';
}
g << endl;
g.close();
return 0;
}