您的位置:首页 > 其它

回文算法2(Manacher)

2018-03-14 13:34 127 查看
问题某个字符串$S$的部分字符串(Substring)是指,从字符串$S$中提取连续的部分而构成的字符串。即,$S=$"abcd"字符串存在"abcd","abc", "bcd", "ab", "bc","cd", "a", "b", "c", "d"。同样,Palindrome是指顺读和倒读都一样的词语。比如,"abcba","abba", "aba"就是Palindrome,但"abcabc" 等则不是Palindrome。给出字符串$S$时,请求出字符串$S$的部分字符串中可以Palindrome的最大长度。 输入在第一行给出字符串$S$,字符串$S$只能由大写的罗马字母构成,长度在$5\,000$ 以内。输出输出给出的字符串的最长的PalindromeSubstring的长度。案例输入ADEEDCCDEEA案例输出8 ####优化以后回文算法(Manacher优化)##########include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 200005
using namespace std;

int f[maxn], len1, len,maxlen=0;
char txt[maxn], s[maxn * 2];
void Manacher(){

for (int i = 0; i<len1; i++){
s[i << 1] = '@';
s[(i << 1) + 1] = txt[i];
}
len = 2 * len1 + 1;
// make start char!= end char
s[0] = '0';
s[len-1] = '\0';
int mx = 0, id = 0;
for (int i = 0; i<len; i++){
if (mx>i) f[i] = min(mx - i, f[2 * id - i]);
else f[i] = 0;
while (s[i + f[i] + 1] != '\0' && s[i + f[i] + 1] == s[i - f[i] - 1]) f[i]++;
if (f[i] + i>mx){
mx = f[i] + i;
id = i;
}
if (f[i] > 0 && s[i + f[i]] == '@') f[i]--;
maxlen = max(maxlen, f[i]+1);
}
return;
}
int main(){

while (scanf("%s", txt) == 1){
len1 = strlen(txt);
Manacher();
printf("%d\n", maxlen);
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  回文