Hdu 5340 Three Palindromes 最大回文串 Manacher
2015-08-01 21:36
274 查看
Three Palindromes
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 80 Accepted Submission(s): 21
[align=left]Problem Description[/align]
Can we divided a given string S into three nonempty palindromes?
[align=left]Input[/align]
First line contains a single integer
T≤20
which denotes the number of test cases.
For each test case , there is an single line contains a string S which only consist of lowercase English letters.1≤|s|≤20000
[align=left]Output[/align]
For each case, output the "Yes" or "No" in a single line.
[align=left]Sample Input[/align]
2
abc
abaadada
[align=left]Sample Output[/align]
Yes
No
题意,是给出一个字符串,能否分成三个非空回文串。
我们可以发现 第一个和第三个串,一定是最大回文串的某个串,Manacher 求出最大回文串的长度,枚举第一个和最后一个,中间直接判断,中点的最大回文串是否包括了就可以了。复杂度为o(n * n).
具体manacher算法参见 Manacher算法
#define N 110050 #define M 100005 #define maxn 205 #define MOD 1000000000000000007 int T,n,a,pri ,ans,len,sn = 0,top ,tail ,pn,ln; bool dp [4]; pii seg ; bool Manacher(char str[],int len){ char tstr[N+N]; int p[N + N],l2 =0,mi; tstr[l2++] = '#'; for(int i =0;i<len;i++){ tstr[l2++] = str[i]; tstr[l2++] = '#'; } p[0] = 0;mi = 0; for(int i = 1;i<l2;i++){ int mi2 = mi + mi - i; if(mi + p[mi] >= i) p[i] = min(mi2 - (mi - p[mi]),p[mi2]); else p[i] = 0; if(p[i] == 0 || mi2 - p[mi2] == mi - p[mi]){ int maxx = p[i]+1; while(i- maxx >= 0 && i+maxx < l2 && tstr[i-maxx] == tstr[i+maxx]){ maxx++; } p[i] = maxx - 1; } if(p[i] + i > p[mi] + mi) mi = i; } int ans = -1;sn = 0;pn = ln = 0; for(int i = 1;i < l2 - 1;i++){ if(i - p[i] == 0) top[pn++] = i; if(i + p[i] == l2 - 1) tail[ln++] = i; } for(int i = 0;i < pn;i++){ for(int j = ln - 1;j>=0;j--){ int s1 = top[i] + p[top[i]] + 1,s2 = tail[j] - p[tail[j]] - 1; if(s1 > s2 ) break; int mid = (s1 + s2)/2; if(p[mid] >= mid - s1) return true; } } return false; //printf("%d\n",ans); } char str ; int main() { while(S(T)!=EOF) { while(T--){ SS(str); len = strlen(str); if(Manacher(str,len)) printf("Yes\n"); else printf("No\n"); } } return 0; }
[align=left]Source[/align]
BestCoder Round #49 ($)
[align=left]Recommend[/align]
hujie | We have carefully selected several similar problems for you: 5342 5341 5339 5338 5337
相关文章推荐
- [LeetCode][Java] Gas Station
- UI03_LTView(继承UIView)和UIAlertView
- 二叉树的层次遍历
- CF 121E - Lucky Array(树状数组裸题)
- mapreduce实现结构化查询(求最大值,求最小值&&求和)
- EFCode First 导航属性
- 信庭嵌入式工作室-老冯终生的遗憾
- Loaders
- uva753 folyd EK算法
- [poj 2425]A Chess Game
- 金融投资的9个环节(不一定适合任何人)
- swift2 泛型
- 图论---Hamilton圈
- strcpy 与memcpy
- 虚拟机软件之Virtualbox的安装篇
- hdu 2846 Repository 字典树
- hihoCoder_#1067_最近公共祖先·二(LCA+tarjan模板)
- 名字的漂亮度
- 创建一个iSCSI target时候不能添加Target IQN的解决方法
- 22. Window print() 方法