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;
}