Pagini recente » Cod sursa (job #2011868) | Cod sursa (job #2968222) | Cod sursa (job #1212518) | Cod sursa (job #2201600) | Cod sursa (job #2734044)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
string text, pattern;
vector < int > RabinKarp(const string &text, const string &pattern)
{
const int base1 = 199;
const int mod1 = 666013;
const int base2 = 211;
const int mod2 = 1000000007;
vector < int > ans;
int p1 = 1;
int p2 = 1;
int h1pattern = 0;
int h2pattern = 0;
int h1text = 0;
int h2text = 0;
for (int i = 0; i < pattern.size(); i++)
{
h1pattern = (1LL * h1pattern * base1 + pattern[i]) % mod1;
h2pattern = (1LL * h2pattern * base2 + pattern[i]) % mod2;
h1text = (1LL * h1text * base1 + text[i]) % mod1;
h2text = (1LL * h2text * base2 + text[i]) % mod2;
if (i > 0)
{
p1 = (1LL * p1 * base1) % mod1;
p2 = (1LL * p2 * base2) % mod2;
}
}
if (h1pattern == h1text && h2pattern == h2text)
ans.push_back(0);
for (int i = pattern.size(); i < text.size(); i++)
{
h1text = (1LL * h1text + mod1 - (1LL * p1 * text[i - pattern.size()]) % mod1) % mod1;
h1text = (1LL * h1text * base1 + text[i]) % mod1;
h2text = (1LL * h2text + mod2 - (1LL * p2 * text[i - pattern.size()]) % mod2) % mod2;
h2text = (1LL * h2text * base2 + text[i]) % mod2;
if (h1pattern == h1text && h2pattern == h2text)
ans.push_back(i - pattern.size() + 1);
}
return ans;
}
int main()
{
f >> pattern >> text;
vector < int > ans = RabinKarp(text, pattern);
g << ans.size() << "\n";
for (int i = 0; i < ans.size() && i < 1000; i++)
g << ans[i] << " ";
return 0;
}