HDU-3068-最长回文-马拉车算法模板题
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
回文就是正反读都是一样的字符串,如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
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 using namespace std; 5 const int N=110020; 6 7 char a[N]; 8 char m[N*2]; 9 int f[N*2]; 10 int k; 11 12 void manacher(char *a,int len) 13 { 14 k=0; 15 m[k++]='$'; 16 m[k++]='#'; 17 for(int i=0; i<len; i++) 18 { 19 m[k++]=a[i]; 20 m[k++]='#'; 21 } 22 m[k]='\0';//或者加其他的只要不是#$字母都可以 23 int mx=0,id=0; 24 for(int i=1; i<k; i++) //?? 25 { 26 // if(mx-i<=ans[i]) 27 // ans[i]=mx-i; 28 // else if(mx-i>ans[i]) 29 if(i>=mx) 30 f[i]=1; 31 else if(i<mx) 32 { 33 // f[i]=min(f[2*id-i],mx-i); 34 if(mx-i>=f[2*id-i])//if(mx-i<=f[j]) 35 f[i]=f[2*id-i]; 36 else if(mx-i<f[2*id-i])//else if(mx-i<f[j]) 37 f[i]=mx-i; 38 } 39 while(m[i-f[i]]==m[i+f[i]]) 40 f[i]++; 41 if(f[i]+i>mx) 42 { 43 mx=f[i]+i; 44 id=i; 45 } 46 } 47 } 48 49 int main() 50 { 51 while(~scanf("%s",a)) 52 { 53 int len=strlen(a); 54 manacher(a,len); 55 int ans=-1; 56 for(int i=0;i<k;i++) 57 ans=max(ans,f[i]-1); 58 printf("%d\n",ans); 59 } 60 return 0; 61 }