哈希是好东西,二分+哈希是更好的东西

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 }

 

以上是关于哈希是好东西,二分+哈希是更好的东西的主要内容,如果未能解决你的问题,请参考以下文章

如果键存在,向哈希值添加一些东西?

有效的哈希或代表一组记录的东西

两个不同文件的哈希值可能是一样的吗

简单的密码加密

下文中的哈希片段指的是啥?

ACM入门之哈希