标签:manacher out 回文 scanf names 包含 style aaa 回文串
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等Input输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000Output每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa abab
Sample Output
4 3
orzzzzzz,Manacher算法的模板题,因为Mp数组只开了一半,wa了10多次。。。。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=110005; 5 6 int Mp[maxn*2]; 7 char s[maxn],Ma[2*maxn]; 8 9 void Mana(char *s,int len){ 10 Ma[0]=‘$‘;Ma[1]=‘#‘; 11 int l=2; 12 for(int i=0;i<len;i++){ 13 Ma[l++]=s[i]; 14 Ma[l++]=‘#‘; 15 } 16 Ma[l]=0; 17 18 int mx=0,id=0,ans=0; 19 for(int i=0;i<l;i++){ 20 if(mx>i) Mp[i]=min(mx-i,Mp[2*id-i]); 21 else Mp[i]=1; 22 while(Ma[i+Mp[i]]==Ma[i-Mp[i]]) ++Mp[i]; 23 ans=max(ans,Mp[i]-1); 24 if(i+Mp[i]>mx){ 25 mx=i+Mp[i]; 26 id=i; 27 } 28 } 29 printf("%d\n",ans); 30 } 31 32 int main() 33 { while(scanf("%s",s)==1){ 34 int len=strlen(s); 35 Mana(s,len); 36 } 37 return 0; 38 }
标签:manacher out 回文 scanf names 包含 style aaa 回文串
原文地址:http://www.cnblogs.com/zgglj-com/p/6847756.html