哈希是好东西,二分+哈希是更好的东西
Posted dcdcbigbig
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈希是好东西,二分+哈希是更好的东西相关的知识,希望对你有一定的参考价值。
rt
明明能哈希为什么要KMP/AC自动机/后缀数组/后缀自动机/后缀树呢???????
【XSY2361】LCP
给定串 S,m 组询问 (X, Y, L, R): 求 S[X:Y] 与 S[L:R] 的最长公共前缀.
1 #include<algorithm>
2 #include<iostream>
3 #include<cstring>
4 #include<cstdio>
5 #include<cmath>
6 #include<queue>
7 #define inf 2147483647
8 #define eps 1e-9
9 using namespace std;
10 typedef long long ll;
11 typedef double db;
12 const ll H=173;
13 int len,m,l,r,x,y;
14 ll hs[100001],pw[100001];
15 char s[100001];
16 int work(int L,int R,int x,int y){
17 int l=1,r=min(R-L+1,y-x+1);
18 if(s[L]!=s[x])return 0;
19 while(l<r){
20 int mid=(l+r)/2;
21 if(hs[L]-hs[L+mid]*pw[mid]==hs[x]-hs[x+mid]*pw[mid])l=mid+1;
22 else r=mid;
23 }
24 if(s[L+l-1]!=s[x+l-1])l--;
25 return l;
26 }
27 int main(){
28 scanf("%s",s+1);
29 len=strlen(s+1);
30 pw[0]=1;
31 for(int i=1;i<=len+1;i++)pw[i]=pw[i-1]*H;
32 for(int i=len;i;i--)hs[i]=hs[i+1]*H+s[i]-‘a‘;
33 scanf("%d",&m);
34 for(int i=1;i<=m;i++){
35 scanf("%d%d%d%d",&l,&r,&x,&y);
36 printf("%d
",work(l,r,x,y));
37 }
38 return 0;
39 }
以上是关于哈希是好东西,二分+哈希是更好的东西的主要内容,如果未能解决你的问题,请参考以下文章