POJ 3974
网上看到的O(n)的方法,Manacher算法,记录一下
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define MAX(a,b) (a>b?a:b) 6 #define MIN(a,b) (a<b?a:b) 7 8 #define M 1000000 9 #define N (M+1)*2 10 11 char input[M+1]; 12 char str[N]; 13 int p[N]; 14 15 int main() 16 { 17 int n; 18 int count = 1; 19 int i,j; 20 int mx = 0; 21 int id; 22 int max; 23 24 while(scanf("%s",input) && !(input[0] == 'E' && input[1] == 'N' && input[2] == 'D')) 25 { 26 max = 0; 27 mx = 0; 28 n = strlen(input); 29 str[0] = '$'; 30 str[1] = '#'; 31 for(i=0; i<n; i++) 32 { 33 str[2*i+2] = input[i]; 34 str[2*i+3] = '#'; 35 } 36 n = 2*n+2; 37 str[n] = '\0'; 38 39 for(i=1;i<n;i++) 40 { 41 if(mx > i) 42 p[i] = MIN(p[2*id-i], mx-i); 43 else 44 p[i] = 1; 45 46 for(;str[i+p[i]] == str[i-p[i]]; p[i]++) ; 47 if(p[i] + i > mx) 48 { 49 mx = p[i] + i; 50 id = i; 51 max = MAX(max,p[i]); 52 } 53 54 } 55 printf("Case %d: %d\n", count++, max-1); 56 } 57 58 return 0; 59 }