最长回文子串(Manacher算法)
2013-07-27 17:03
246 查看
题目描述:
回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
回文子串,顾名思义,即字符串中满足回文性质的子串。
给出一个只由小写英文字符a,b,c...x,y,z组成的字符串,请输出其中最长的回文子串的长度。
输入:
输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c...x,y,z组成的字符串,字符串的长度不大于200000。
输出:
对于每组测试用例,输出一个整数,表示该组测试用例的字符串中所包含的的最长回文子串的长度。
样例输入:
样例输出:
[/code]
回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
回文子串,顾名思义,即字符串中满足回文性质的子串。
给出一个只由小写英文字符a,b,c...x,y,z组成的字符串,请输出其中最长的回文子串的长度。
输入:
输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c...x,y,z组成的字符串,字符串的长度不大于200000。
输出:
对于每组测试用例,输出一个整数,表示该组测试用例的字符串中所包含的的最长回文子串的长度。
样例输入:
abab bbbb abba
样例输出:
3 4 4
#include <stdio.h> char s[200002]; char str[400010]; int p[400010]; int min(int a,int b){ return a < b ? a : b; } int pre(){ int i,j = 0; str[j++] = '$'; for(i = 0;s[i];i++){ str[j++] = '#'; str[j++] = s[i]; } str[j++] = '#'; str[j] = '\0'; return j; } void manacher(int n){ int mx = 0,id,i; p[0] = 0; for(i = 1;i < n;i++){ if(mx > i) p[i] = min(mx - i,p[2 * id - i]); else p[i] = 1; while(str[i - p[i]] == str[i + p[i]]) p[i]++; if(p[i] + i > mx){ mx = p[i] + i; id = i; } } } int main(int argc, char const *argv[]){ while(scanf("%s",s) != EOF){ int n = pre(); manacher(n); int ans = 0,i; for(i = 1;i < n;i++) if(p[i] > ans) ans = p[i]; printf("%d\n",ans - 1); } return 0; }
[/code]
相关文章推荐
- 求字符串的最长回文子串(manacher算法O(n)时间)
- hdu 3068 最长回文子串 Manacher算法
- 最长回文子串——Manacher算法
- 字符串之最长回文子串 manacher算法
- hihoCoder 最长回文子串(manacher算法:马拉车)
- 求最长回文子串算法分析-Manacher算法
- 【51NOD-0】1089 最长回文子串 V2(Manacher算法)
- 51nod1089---最长回文子串 V2(51nod基础:Manacher算法)
- Manacher算法实现求最长回文子串的长度
- 最长回文子串_Manacher算法_hihoCoder1032
- 1040. Longest Symmetric String (25)【最长回文子串-马拉车(manacher算法)——PAT (Advanced Level) Practise
- poj 3974 Manacher算法(判断最长回文子串)
- HiHo 1032 最长回文子串 (Manacher算法求解)
- 最长回文子串-Manacher算法
- 【字符串处理】最长回文子串笔记(Manacher算法)
- Manacher算法解决最长回文子串问题---O(n)时间复杂度
- Manacher算法——求最长回文子串
- 最长回文子串-manacher算法
- hdu【最长回文子串——Manacher算法】POJ 3974/HDU 3068
- Manacher算法求解最长回文子串