Karp-Rabin算法模板

博主链接

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#define d 256	//字符表中字符数目 
using namespace std;
string s,p;
void RK(int q){
	//assert( s&& p && q > 0 );	//如果传递的有错,则打印提示 
	int m=p.size();
	int n=s.size();
	int p_h=0;	//模式串hash 
	int s_h=0;	//s串hash 
	int h=1;
	for(int i=0;i<m-1;i++)h=(h*d)%q;	//h表示ts+1 = 10(31415 - 10000*3) +2 = 14152中的10000   
	for(int i=0;i<m;i++){
		p_h= ( d * p_h + p[i] ) % q;
		s_h= ( d * s_h + s[i] ) % q;		
	}	//求出开始p_h 和 s_h 
	for(int i=0;i<n-m;i++){
		if(p_h==s_h){
			int j;
			for(j=0;j<m;j++)
				if(s[i+j]!=p[j])break;
			if(j==m)printf("P occurs with shifts: %d\n",i);
		}
		if(i<n-m){
			s_h=(d*(s_h-s[i]*h)+s[i+m])%q;
			if(s_h<0)
				s_h+=q;
		}
	}
}
int main(){
	s="GEEKlmnaS FOR GEEKlmnaS njknaskjdaskjbdkjasbdjas njabijbaslbckjsbfGEEKlmnaS FOR GEEKlmnaS";
	p="GEEKlmna";
	int mod=127;	需要比s长度大 
	RK(mod);
} 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值