1. 程式人生 > >最長迴文 HDU

最長迴文 HDU

manacher水題

# include <string.h>
# include <stdio.h>
# include <algorithm>
const int maxn=110005;
int a[maxn<<1];
char str[maxn<<1];

int main(){
    using namespace std;
    while(~scanf("%s", str)){
        int len=strlen(str), id=0, maxlen=0;
        for(int i=len; i>=0; i--){
            str[i*2+1]='#';
            str[i*2+2]=str[i];
        }
        str[0]='*';
        //algorithm main selection
        for(int i=2; i<2*len+1; i++){
            if(a[id]+id>i)
                a[i]=min(a[2*id-i], a[id]+id-i);
            else
                a[i]=1;
            while(str[i-a[i]] == str[i+a[i]])
                a[i]++;
            if(id+a[id]<i+a[i])
                id=i;
            if(maxlen<a[i])maxlen=a[i];
        }
        printf("%d\n",maxlen-1);
    }
    return 0;
}

總結:罪惡的g++超時,c++ac,manacher就是在字元之間插入一個未出現過的字元,例如#,插入個數len+1,保證無論是奇數長度還是偶數長度都可以解決字串迴文問題,str[0]網上說要插入一個不同的字元,反思不懂。