RabinKarp.h
#pragma once
#include <string>
class RabinKarp
{
private:
int R;
int Q;
long RM;
long pattHash;
std::string pattern;
private:
long partHash(const std::string& s,const int& M)
{
long h = 0;
for (int i = 0; i < M; ++i)
h = (h * R + s[i]) % Q;
return h;
}
public:
RabinKarp(const std::string& p,const int& r = 256,const int& q = 99997):pattern(p),R(r),Q(q)
{
pattHash = partHash(p, p.length());
RM = 1;
for (int i = 1; i < p.length(); ++i)
{
RM = (RM * r) % Q;
}
}
int indexOf(const std::string& s)
{
int N = s.length();
int M = pattern.length();
long sHash = partHash(s, pattern.length());
if (pattHash == sHash) return 0;
for (int i = pattern.length(); i < N; ++i)
{
sHash = (sHash + Q - RM * (s[i - M]) % Q) % Q;
sHash = (sHash * R + s[i]) % Q;
if (pattHash == sHash)
return i - M + 1;
}
return N;
}
};
main.cpp
#include <iostream>
#include "RabinKarp.h"
using namespace std;
int main()
{
RabinKarp rk("26535");
cout << rk.indexOf("3141592653589793") << endl;
RabinKarp r("AACAA");
cout << r.indexOf("AACADAACDERTFASAACAASSS");
system("pause");
return 0;
}