HDU 3068 最长回文
Problem Description
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa
abab
Sample Output
4
3
代码:
#include <bits/stdc++.h> using namespace std; const int maxn = 3e5; char s[maxn], str[maxn]; int len[maxn]; int ls, id, mx; void init() { int k = 0; str[k ++] = '$'; for(int i = 0; i < ls; i ++) { str[k ++] = '#'; str[k ++] = s[i]; } str[k ++] = '#'; ls = k; } int Manacher() { len[0] = 0; int sum = 0; mx = 0; for(int i = 1; i < ls; i ++) { if(i < mx) len[i] = min(mx - i, len[2 * id - i]); else len[i] = 1; while(str[i - len[i]] == str[i + len[i]]) len[i] ++; if(len[i] + i > mx) { mx = len[i] + i; id = i; sum = max(sum, len[i]); } } return (sum - 1); } int main() { while(~scanf("%s", s)) { memset(str, 0, sizeof(str)); ls = strlen(s); init(); int ans = Manacher(); printf("%d\n", ans); } return 0; }
Manacher 模板题 用 string TLE。。。改到 char 就 AC 了 差这么多的么。。。