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 }