• 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
    ",ans);
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    计算机存储单位
    TcpListener、TcpClient
    JobConf
    JobClient
    python正则方法
    c#列表操作
    C#解析xml
    C#字符串操作函数
    Binding
    Name和:Name
  • 原文地址:https://www.cnblogs.com/fu3638/p/8504002.html
Copyright © 2020-2023  润新知