求助 RK 字符串匹配算法
  • 板块学术版
  • 楼主lailai0916
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/26 23:06
  • 上次更新2023/11/2 11:16:34
查看原帖
求助 RK 字符串匹配算法
455474
lailai0916楼主2023/10/26 23:06
#include <bits/stdc++.h>
using namespace std;

const int base=131;
unsigned long long Pow(unsigned long long a,unsigned long long b)
{
	//自然溢出的快速幂 
	unsigned long long res=1;
	while(b)
	{
		if(b&1)res=res*a;
		a=a*a;
		b>>=1;
	}
	return res;
}
int RK(string s1,string s2)
{
	int l1=s1.length(),l2=s2.length();//字符串长度 
	if(l1<l2)return -1;
	//每次匹配最左边的权值一定是base^(l2-1),预处理成p 
	unsigned long long h1=0,h2=0,p=Pow(base,l2-1); 
	for(int i=0;i<l2;i++)
	{
		//计算自然溢出的hash 
		h1=h1*base+s1[i];
		h2=h2*base+s2[i];
	}
	for(int i=0;i<l1-l2;i++)//枚举所有左端点 
	{
		//如果hash相同,验算答案 
		if(h1==h2&&s1.substr(i,l2)==s2)return i;
		//递推维护下一个匹配的hash 
		h1=(h1-s1[i]*p)*base+s1[i+l2];
	}
	return -1;
}
int main()
{
	string s1,s2;
	while(cin>>s1>>s2)
	{
		cout<<RK(s1,s2)<<'\n';
	}
	return 0;
}

用 KMP 过了,用 RK 算法 WA #50.

2023/10/26 23:06
加载中...