字符串前缀哈希

字符串前缀哈希

算法思想:

  • 字符串处理利器
  • 核心:把一个字符串转换为一个P进制数字
  • 可以用来快速判断两个子字符串是不是相等
  • 不容忍冲突,不考虑解决冲突,只要取经验值就可以99.99%保证没有冲突
  • Q的取模与存储可以直接用 unsigned long long 溢出就相当于取模

字符串前缀哈希

字符串前缀哈希2

字符串哈希3

代码实现

const int N=100010,P=131;
char str[N];
typedef unsigned long long ULL;
ULL h[N],p[N];
ULL get(int l,int r)
{
	return h[r]-h[l-1]*p[r-l+1];
}
int main()
{
	int n,m;
	cin>>n>>m>>(str+1);
	p[0] = 1;
	for(int i = 1;i<=n;i++)
	{
		p[i] = p[i-1] * P;
		h[i] = h[i-1] * P +str[i];
	}
	while(m--)
	{
		int l1,r1,l2,r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		if(get(l1,r1) == get(l2,r2))	puts("Yes");
		else puts("No");
	}
}

猜你喜欢

转载自www.cnblogs.com/codertea/p/12798192.html