作者:手机用户2502938867 | 来源:互联网 | 2023-06-02 18:47
http:acm.hdu.edu.cnshowproblem.php?pid3068 ProblemDescription给出一个只由小写英文字符a,b,cy,z组成的字符串
http://acm.hdu.edu.cn/showproblem.php?pid=3068
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
代码:
#include
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 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 if(i 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 了 差这么多的么。。。
FH