HDU 4763 Theme Section(KMP+枚举公共前后缀)

Posted Yeader

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 4763 Theme Section(KMP+枚举公共前后缀)相关的知识,希望对你有一定的参考价值。

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4763 

题目大意:

给你一个字符串s,存在一个
子串E同时出现在前缀、中间、后缀,即EAEBE这种模式,A和B可以是任意长度字符串。

解题思路:

其实就是把所有公共前后缀都枚举一遍,每次将
s同时减去前缀和后缀,再将公共前后缀作为模式串进行kmp算法,如果能匹配到,则输出长度即可。

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=2e6+5;
 7 
 8 int nxt1[maxn],nxt2[maxn],p[maxn];
 9 char s[maxn],str[maxn];
10 
11 void getnext(char *t,int len,int *nxt){
12     int i,j;
13     i=0,j=nxt[0]=-1;
14     while(i<len){
15         while(j!=-1&&t[i]!=t[j])
16             j=nxt[j];
17         nxt[++i]=++j;
18     }
19 }
20 
21 bool kmp(char *s,int len1,char *t,int len2){
22     int i,j;
23     i=j=0;
24     getnext(t,len2,nxt2);
25     while(i<len1){
26         while(j!=-1&&s[i]!=t[j])
27             j=nxt2[j];
28         i++,j++;
29         if(j==len2)
30             return true;
31     }
32     return false;
33 }
34 
35 int main(){
36     int t;
37     scanf("%d",&t);
38     while(t--){
39         scanf("%s",s);
40         int len=strlen(s);
41         getnext(s,len,nxt1);
42         int t=nxt1[len];
43         int ans=0;
44         while(t>0){
45             if(kmp(s+t,len-2*t,s,t)){
46                 ans=t;
47                 break;
48             }
49             t=nxt1[t];
50         }
51         printf("%d\n",ans);
52     }
53     return 0;
54 }

 

以上是关于HDU 4763 Theme Section(KMP+枚举公共前后缀)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 4763 Theme Section

hdu4763 Theme Section

hdu4763Theme Section

HDU4763-Theme Section(KMP+二分)

HDU-4763 Theme Section KMP

Theme Section HDU - 4763(些许暴力)