最长回文
给出一个只由小写英文字符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算法
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<utility>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#define maxn 220010
#define INF 0x3f3f3f3f
#define LL long long
#define ULL unsigned long long
#define E 1e-8
#define mod 1000000007
#define P pair<int,int>
#define MID(l,r) (l+(r-l)/2)
#define lson(o) (o<<1)
#define rson(o) (o<<1|1)
using namespace std;
int rad[maxn];
char str[maxn], tmpstr[maxn];
int manachar() {
int ans = 0, mix = 0, id = 0, len = strlen(str);
for (int i = 1; i <= len; i++) {
if (mix > i)
rad[i] = min(rad[2 * id - i], mix - i);
else
rad[i] = 1;
for ( ; str[i - rad[i]] == str[i + rad[i]]; rad[i]++) {
if (mix < i + rad[i]) {
mix = i + rad[i];
id = i;
}
}
ans = max(ans, rad[i]);
}
return ans - 1;
}
int main() {
while (gets(tmpstr)) {
int len = strlen(tmpstr), cnt = 0;
str[cnt++] = '$';
for (int i = 0; i <= len; i++) {
str[cnt++] = '#';
str[cnt++] = tmpstr[i];
}
getchar();
printf("%d\n", manachar());
}
return 0;
}