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. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务