Pagini recente » Cod sursa (job #856213) | Cod sursa (job #3216378) | Cod sursa (job #1392862) | Cod sursa (job #3259978) | Cod sursa (job #1984602)
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
vector<int> RabinKarp(const string &s, const string &pattern)
{
vector<int> ret;
if(s.size() < pattern.size())
return ret;
const int base1 = 173;
const int base2 = 217;
unsigned long long basePow1 = 1;
unsigned long long patternHash1 = 0;
unsigned long long sHash1 = 0;
unsigned long long basePow2 = 1;
unsigned long long patternHash2 = 0;
unsigned long long sHash2 = 0;
int i;
for(i = 0; i < pattern.size(); ++i)
{
patternHash1 = patternHash1 * base1 + pattern[i];
sHash1 = sHash1 * base1 + s[i];
patternHash2 = patternHash2 * base2 + pattern[i];
sHash2 = sHash2 * base2 + s[i];
}
for(int i = 1; i < pattern.size(); ++i)
{
basePow1 *= base1;
basePow2 *= base2;
}
if(patternHash1 == sHash1 && patternHash2 == sHash2)
ret.push_back(0);
int start, stop;
while(i < s.size())
{
start = i - pattern.size() + 1;
stop = i;
sHash1 -= s[start - 1] * basePow1;
sHash1 = sHash1 * base1 + s[stop];
sHash2 -= s[start - 1] * basePow2;
sHash2 = sHash2 * base2 + s[stop];
if(sHash1 == patternHash1 && sHash2 == patternHash2)
ret.push_back(start);
++i;
}
return ret;
}
int main()
{
ifstream in("strmatch.in");
ofstream out("strmatch.out");
string a, b;
in >> a >> b;
vector<int> sol = RabinKarp(b, a);
out << sol.size() << "\n";
for(auto x:sol)
out << x << " ";
in.close();
out.close();
return 0;
}