1. 程式人生 > >HDU3068 最長回文

HDU3068 最長回文

處理 小寫 字符 case link manacher title blog put

Description 給出一個只由小寫英文字符a,b,c...y,z組成的字符串S,求S中最長回文串的長度.
回文就是正反讀都是一樣的字符串,如aba, abba等
Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字符a,b,c...y,z組成的字符串S 兩組case之間由空行隔開(該空行不用處理)
字符串長度len <= 110000 Output

每一行一個整數x,對應一組case,表示該組case的字符串中所包含的最長回文長度.
Sample Input

aaaa

abab

Sample Output

4
3

當做是Manacher算法的模板題吧...估計實用價值和KMP沒什麽區別

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=250010;
 4 char s[N],ss[N];
 5 int RL[N];
 6 int calc(){
 7     ss[0]=#;
 8     for(int i=1,i_end=strlen(s);i<=i_end;++i){
 9         ss[(i<<1)-1]=s[i-1];
10         ss[(i<<1|1)-1]=#;
11     }
12     int len=strlen(s)<<1
|1; 13 int MaxRight=0,pos=0,maxlen=0; 14 for(int i=0;i<=len;++i){ 15 if(i<MaxRight)RL[i]=min(RL[(pos<<1)-i],MaxRight-i); 16 else RL[i]=1; 17 18 while(i-RL[i]>=0&&i+RL[i]<=len&&ss[i-RL[i]]==ss[i+RL[i]])++RL[i]; 19 if(RL[i]+i-1
>MaxRight) 20 MaxRight=RL[i]+i-1,pos=i; 21 maxlen=max(maxlen,RL[i]); 22 } 23 return maxlen-1; 24 } 25 int main(){ 26 while(~scanf("%s",s)) 27 printf("%d\n",calc()); 28 return 0; 29 }

HDU3068 最長回文