最长回文串O(N)算法 manacher
2013-05-20 12:00
453 查看
// 原串最大长度N // 返回最大回文字串 res #include<cstdio> #include<cstring> #include<cstdlib> #include<string> #include<algorithm> using namespace std; const int N = 1024; int rid[N<<2]; string manacher(char *s){ string t, res; int L = strlen(s); // init t += '?'; for(int i = 0; i < L; i++) t += '#', t += s[i]; t += "#*"; // getrid for(int i=1,j=0,k,End=(int)t.size();i<End;){ while( t[i-j-1]==t[i+j+1] ) j++; rid[i] = j; for(k=1;k<=j&&(rid[i-k]!=rid[i]-k);k++) rid[i+k] = min( rid[i-k], rid[i]-k ); i += k; j = max( 0,j-k ); } // Max int m = 0, pos; for(int i = 1; i < (int)t.size(); i++){ if( m < rid[i]*2+(t[i]!='#') ) m = rid[i]*2+(t[i]!='#'), pos = i; } for(int i = pos-rid[pos]; i <= pos+rid[pos]; i++){ if( t[i] != '#' ) res += t[i]; } return res; } int main(){ char s ; scanf("%s", s); string ans = manacher(s); // printf("MaxLength = %d\n", ans.size() ); printf("%s\n", ans.c_str() ); return 0; }
相关文章推荐
- hdu 3068 最长回文 (Manacher算法求最长回文串)
- Manacher 算法 求最长字回文串
- Manacher算法求最长回文串
- manacher算法求最长回文串 和 hdu 3068 最长回文串
- hdu 3068 最长回文串 o(n) Manacher 算法
- manacher 算法(最长回文串)
- 求解最长回文串(Manacher 算法)——自我总结
- Manacher算法,最长回文串,时间复杂度O(n)
- hdu 3068 && pku 3974 (最长回文串)(Manacher 算法)
- Manacher算法 O(n)求最长回文串
- leetcode 5 Longest Palindromic Substring(Manacher算法求最长回文串)
- HDU3068-manacher算法-最长回文串
- 最长回文串模板 (Manacher's算法)o(n)复杂度
- 最长回文---hdu3068 (回文串 manacher 算法模板)
- hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))
- bzoj 2565: 最长双回文串 manacher算法
- manacher算法求最长回文串长度
- 字符串专题小结:Manacher算法求最长回文串
- Manacher算法求最长回文串
- POJ 3974 Palindrome【最长回文串(Manacher模板)】