标签:des style blog http io color ar os sp
Description
Input
Output
Sample Input
abcbabcbabcba abacacbaaaab END
Sample Output
Case 1: 13 Case 2: 6
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=1000000+10; 7 //manacher算法 8 const int LEN=maxn; 9 const int N=LEN*2; 10 int p[N]; 11 char str[LEN],tmp[N]; 12 //p[i]表示以str[i]为中心的回文往右延伸的 最长长度 13 void manacher(char* str, int* p) 14 { 15 int n=strlen(str), i, id, mx; 16 for(p[mx=id=0]=i=1; i<n; i++) 17 { 18 p[i]=mx>i?min(p[2*id-i], mx-i+1):1; 19 while(i+p[i]<n&&i-p[i]>=0&&str[i+p[i]]==str[i-p[i]]) p[i]++; 20 if(mx<i+p[i]-1) 21 { 22 id=i; 23 mx=i+p[i]-1; 24 } 25 } 26 } 27 //求str的最长回文的长度 28 int maxPalindrome(char* str) 29 { 30 int ans=0; 31 int i, n; 32 for(i=0, n=strlen(str); i<n; i++) 33 { 34 tmp[2*i]=‘#‘; 35 tmp[2*i+1]=str[i]; 36 } 37 tmp[2*i]=‘#‘; 38 tmp[2*i+1]=‘\0‘; 39 n=n*2+1; 40 manacher(tmp, p); 41 for(i=0; i<n; i++) 42 { 43 if(ans < p[i]-1) 44 { 45 ans = p[i]-1; 46 } 47 } 48 return ans; 49 } 50 int main() 51 { 52 int i=1; 53 for(i=1;; i++) 54 { 55 scanf("%s",str); 56 char s[]= {‘E‘,‘N‘,‘D‘,‘\0‘}; 57 if(strcmp(str,s)==0) 58 break; 59 else 60 printf("Case %d: %d\n",i,maxPalindrome(str)); 61 } 62 return 0; 63 }
Palindrome(最长回文串manacher算法)O(n)
标签:des style blog http io color ar os sp
原文地址:http://www.cnblogs.com/wpnan/p/4093425.html