HDU3068最长回文马拉车算法模板题

给出一个只由小写英文字符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

 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 }


 
原文地址:https://www.cnblogs.com/OFSHK/p/11368399.html