Theme Section

题意:

就是每一首歌都是EAEBE这样的类型,其中A和B可以没有,就是让你找出来E的最大长度

题解:

第一种思路:

可以先找出来头和尾的最大相同程度,最小可以从1开始,最大小于len/3

然后再利用kmp算法找出来中间有没有相同部分就可以了

但是这一种方法太麻烦了,还有切割字符串,看下面

第二种:

我们可以先通过kmp求出来他的next数组

这样前缀和后缀的E就已经满足了,只需要在中间找到next[i]也等于next[len]

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=1e6+10;
 7 char ptr[maxn];
 8 int nnn[maxn];
 9 void get_next(int plen)
10 {
11     int i=0,j;
12     j=nnn[0]=-1;
13     while(i<plen)
14     {
15         while(j!=-1 && ptr[i]!=ptr[j]) j=nnn[j];
16         nnn[++i]=++j;
17     }
18 }
19 int kmp(int plen)
20 {
21     get_next(plen);
22     for(int k=nnn[plen];k;k=nnn[k])
23     {
24         //printf("%d %d %d\n",k,2*k-1,plen-k);
25         for(int i=2*k-1;i<plen-k;++i)
26         {
27             if(nnn[i]+1==k)
28                 return k;
29         }
30     }
31     return 0;
32 }
33 int main()
34 {
35     int t;
36     scanf("%d",&t);
37     while(t--)
38     {
39         scanf("%s",ptr);
40         int len=strlen(ptr);
41         int q=kmp(len);
42         printf("%d\n",q);
43     }
44     return 0;
45 }
View Code

猜你喜欢

转载自www.cnblogs.com/kongbursi-2292702937/p/11270974.html