manachar算法(HDU3068)

最长回文

Problem 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

解题思路:

manachar算法模板题。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 210000 + 5;

int RL[maxn],ans;
char sc[maxn],s[maxn];

int main(){
    while(~scanf("%s",sc)){
        memset(s,'#',sizeof(s));
        memset(RL,0,sizeof(RL));
        int len = strlen(sc);
        for(int i = 0,j = 1;i < len; i++,j += 2)s[j] = sc[i];//插特殊字符
        len = (len<<1) + 1;
        int pos = 0,max_right = 0,ans = 0;
        for(int i = 0;i < len; i++){
            if(i < max_right)RL[i] = min(RL[2*pos-i],max_right-i);//寻找对称点更新
            else RL[i] = 1;
            while(s[i - RL[i]] == s[i + RL[i]])RL[i]++;//扩展
            if(i + RL[i] > max_right){//更新pos 与 max_right
                max_right = i + RL[i];
                pos = i;
            }
            ans = max(ans,RL[i]);
        }
        printf("%d\n",ans-1);
    }
    return 0;
}

posted @ 2017-09-01 19:45  Frade~  阅读(166)  评论(0编辑  收藏  举报