HDU 3068 最长回文(Manacher算法解决最长回文串问题)
2016-09-29 23:23
513 查看
这算是个历史遗留问题了啊,当时没怎么看,最近又发现了,标记一下。脑子越来越不好使了啊。
Manacher算法:http://blog.csdn.net/xingyeyongheng/article/details/9310555
解释一下:p[id]+id表示最远(从左向右)可以到达的字符串。
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 18167 Accepted Submission(s): 6677
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
Source
2009 Multi-University Training Contest 16 - Host
by NIT
Manacher算法:http://blog.csdn.net/xingyeyongheng/article/details/9310555
解释一下:p[id]+id表示最远(从左向右)可以到达的字符串。
最长回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 18167 Accepted Submission(s): 6677
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
Source
2009 Multi-University Training Contest 16 - Host
by NIT
#include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #include <iomanip> #include <stdio.h> #include <string> #include <queue> #include <cmath> #include <stack> #include <ctime> #include <map> #include <set> #define eps 1e-9 ///#define M 1000100 ///#define LL __int64 #define LL long long ///#define INF 0x7ffffff #define INF 0x3f3f3f3f #define PI 3.1415926535898 #define zero(x) ((fabs(x)<eps)?0:x) #define mod 1000000007 #define Read() freopen("autocomplete.in","r",stdin) #define Write() freopen("autocomplete.out","w",stdout) #define Cin() ios::sync_with_stdio(false) using namespace std; const int maxn = 222000; char str[maxn]; char s[maxn]; int p[maxn]; int main() { while(~scanf("%s", s)) { int len = strlen(s); str[0] = '#'; str[1] = '$'; for(int i = 0, j = 2; i < len; i++) { str[j++] = s[i]; str[j++] = '$'; } int id = 0; int Max = 0; memset(p, 0, sizeof(p)); for(int i = 2; i < 2*len+1; i++) { if(p[id]+id > i) p[i] = min(p[2*id-i], p[id]+id-i); else p[i] = 1; while(str[i-p[i]] == str[i+p[i]]) p[i]++; if(p[id]+id < i+p[i]) id = i; Max = max(Max, p[i]); } cout<<Max-1<<endl; } return 0; }
相关文章推荐
- HDU 3068-最长回文(Manacher算法O(n)求最长回文串)
- hdu 3068 最长回文(最长回文子串 manacher算法)
- HDU 3068 最长回文 Manacher算法
- HDU 3068 最长回文(manacher算法)
- hdu 3068 最长回文(Manacher算法入门模板题)+解题套路
- HDU-3068-最长回文 (Manacher算法)
- Hdu 3068 最长回文 (manacher算法)
- HDU-3068-最长回文 (Manacher算法)
- hdu 3068 最长回文 (manacher算法)
- [hdu 3068] 最长回文 manacher算法
- hdu 3068 最长回文子串 Manacher算法
- 【最长回文子串——Manacher算法】POJ 3974/HDU 3068
- hdu 3068 最长回文 manacher算法
- HDU 3068 最长回文 (manacher算法)
- Manacher算法解决最长回文子串问题---O(n)时间复杂度
- HDU 3068 最长回文(manacher算法:回文字串)
- hdu 3068 最长回文(manacher算法)
- HDU 3068 最长回文 Manacher算法
- HDU 3068 manacher算法(O(n)的最长回文串算法)
- HDU 3068 最长回文(Manacher算法模板)