Pagini recente » Cod sursa (job #2066606) | Cod sursa (job #2741865) | Cod sursa (job #2917190) | Cod sursa (job #653781) | Cod sursa (job #3170586)
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstring>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
long long base = 31, mod = 2147483647, power;
char str[2000005], pattern[2000005];
struct Hash {
int base;
int mod;
long long value;
Hash() { base = 0, mod = 0, value = 0; }
Hash(int base, int mod) { this->base = base, this->mod = mod, value = 0; }
void roll(char toRemove, char toAdd) {
value = (((value - (long long)(toRemove * power) % mod) * base) % mod + toAdd) % mod;
}
void init(char *str, int length) {
int p = 1;
for (int i = length - 1; i >= 0; i--, p *= base)
value += (int) (str[i] * p) % mod;
}
bool operator==(const Hash& other) const { return value == other.value; }
};
Hash patternHash(base, mod), strHash(base, mod);
int main() {
fin >> pattern >> str;
patternHash.init(pattern, strlen(pattern));
strHash.init(str, strlen(pattern));
int length = strlen(str), pLength = strlen(pattern);
power = pow(base, pLength - 1);
int sol[1005], solutions = 0;
for (int i = pLength - 1; i < length - 1; i++) {
if (strHash == patternHash) {
solutions++;
if (solutions < 1000)
sol[solutions - 1] = i - pLength + 1;
}
strHash.roll(str[i - pLength + 1], str[i + 1]);
}
fout << solutions << "\n";
for (int i = 0; i < solutions && i < 1000; i++)
fout << sol[i] << " ";
}