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
用manacher算法求最长回文串长度。
#include#include #include #include #include #include #include #include #include #include #define INF 10000001using namespace std;const int maxn = 110005*2;char str[maxn];int p[maxn];void manacher(char *s, int len){ p[0] = 1 ; int Max = 0, d= 0 ; for(int i=1; i i ? min(p[d*2-i],Max-i):1 ; while( s[i+p[i]] == s[i-p[i]]) p[i] ++ ; if( i + p[i] > d + p[d] ){ d = i ; Max = i + p[i] ; } }}int main(){ while( ~ scanf("%s",str) ){ int len = strlen(str); for(int i=len; i>=0; i--){ str[(i<<1)+1] = '#' ; str[(i<<1)+2] = str[i] ; } str[0] = '*' ; len = len * 2 + 2 ; manacher(str,len); int ans = 0 ; for(int i=0; i