Pagini recente » Cod sursa (job #161270) | Cod sursa (job #426709) | Cod sursa (job #323865) | Cod sursa (job #5224) | Cod sursa (job #2142228)
#include <bits/stdc++.h>
#define NMAX 2000005
#define MOD1 1000003
#define MOD2 10003
#define BASE 73
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
int log_pow(int base, int expo, int mod) {
int res = 1;
while (expo) {
if (expo & 1) {
res = (1LL * res * base) % mod;
}
base = (1LL * base * base) % mod;
expo >>= 1;
}
return res;
}
int main() {
int limit, N, power1, power2;
int strHash1 = 0, strHash2 = 0;
int patternHash1 = 0, patternHash2 = 0;
vector <int> sol;
string text, pattern;
fin >> pattern >> text;
N = pattern.size();
power1 = log_pow(BASE, N - 1, MOD1);
power2 = log_pow(BASE, N - 1, MOD2);
for (int i = 0; i < N; ++i) {
patternHash1 = (patternHash1 * BASE + pattern[i]) % MOD1;
patternHash2 = (patternHash2 * BASE + pattern[i]) % MOD2;
strHash1 = (strHash1 * BASE + text[i]) % MOD1;
strHash2 = (strHash2 * BASE + text[i]) % MOD2;
}
if (strHash1 == patternHash1 && strHash2 == patternHash2) {
sol.push_back(0);
}
for (int i = N; i < (int)text.size(); ++i) {
strHash1 = ((strHash1 - (power1 * text[i - N]) % MOD1 + MOD1) * BASE + text[i]) % MOD1;
strHash2 = ((strHash2 - (power2 * text[i - N]) % MOD2 + MOD2) * BASE + text[i]) % MOD2;
if (strHash1 == patternHash1 && strHash2 == patternHash2) {
sol.push_back(i - N + 1);
}
}
limit = min((int)sol.size(), 1000);
fout << sol.size() << '\n';
for (int i = 0; i < limit; ++i) {
fout << sol[i] << ' ';
}
return 0;
}