Pagini recente » Cod sursa (job #1381924) | Cod sursa (job #3132392) | Cod sursa (job #2715979) | Cod sursa (job #1563896) | Cod sursa (job #1710666)
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f{ "strmatch.in" };
ofstream q{ "strmatch.out" };
#define PRIME 101
#define MOD 746533
#define AUXMOD 746773
void RabinKarp(const string& pattern, const string& text) {
int n = (int)text.size();
int m = (int)pattern.size();
if (n < m) {
q << "0";
return;
}
int patternHash = 0;
int searchHash = 0;
int patternCheck = 0;
int searchCheck = 0;
int pow;
int powCheck;
vector <int> pozitii;
pow = powCheck = 1;
for (int i = 0; i < m; i++) {
patternHash = (patternHash * PRIME + pattern[i]) % MOD;
searchHash = (searchHash * PRIME + text[i]) % MOD;
patternCheck = (patternCheck * PRIME + pattern[i]) % AUXMOD;
searchCheck = (searchCheck * PRIME + text[i]) % AUXMOD;
if (i != 0) pow = (pow*PRIME) % MOD, powCheck = (powCheck * PRIME) % AUXMOD;
}
if (patternHash == searchHash) {
pozitii.push_back(0);
}
for (int i = m; i < n; i++) {
searchHash = (((searchHash - text[i - m] * pow) % MOD + MOD)* PRIME +text[i]) % MOD;
searchCheck = (((searchCheck - text[i - m] * powCheck) % AUXMOD + AUXMOD)* PRIME + text[i]) % AUXMOD;
if (patternHash == searchHash && searchCheck == patternCheck) {
pozitii.push_back(i-m+1);
}
}
q << pozitii.size() << "\n";
int mins = min((int)pozitii.size(), 1000);
for (int i = 0; i < mins; i++) q << pozitii[i] << " ";
}
int main() {
string pattern, text;
f >> pattern >> text;
RabinKarp(pattern, text);
f.close();
q.close();
}