字符串前缀哈希
算法思想:
- 字符串处理利器
- 核心:把一个字符串转换为一个P进制数字
- 可以用来快速判断两个子字符串是不是相等
- 不容忍冲突,不考虑解决冲突,只要取经验值就可以99.99%保证没有冲突
- Q的取模与存储可以直接用 unsigned long long 溢出就相当于取模
代码实现
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");
}
}