HDU 3068 最长回文 (Manacher 模板题)

题意:

          中文

思路:

          Manacher 模板题

          另有回文自动机解法

代码:

#include 
using namespace std;
const int MAXN=210000;
struct Manacher{
    char Ma[MAXN*2];
    int Mp[MAXN*2];
    int Mx[MAXN*2];
    int len;
    double ave;
    int l;
    int ans;
    void manachar(char s[]){
        l=0;ans=0;
        len=strlen(s);
        Ma[l++]='$';
        Ma[l++]='#';
        for(int i=0; ii?min(Mp[2*id-i],mx-i):1;
            while(Ma[i+Mp[i]]==Ma[i-Mp[i]]){
                Mp[i]++;
                ave++;
            }
            if(i+Mp[i]>mx)
            {
                mx=i+Mp[i];
                id=i;
            }
            Mx[i]=mx;
            ans=max(ans,Mp[i]-1);
        }
        ave/=len;
    }
    void debug(){
        printf("id:     ");
        for(int i=0;i

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