码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-12-14 13:01:33      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:后缀自动机   ac自动机   好的   数组   mes   nbsp   name   class   col   

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\n",work(l,r,x,y));
37     }
38     return 0;
39 }

 

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

标签:后缀自动机   ac自动机   好的   数组   mes   nbsp   name   class   col   

原文地址:https://www.cnblogs.com/dcdcbigbig/p/10118250.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!