HDU5340-Three Palindromes

来源:互联网 发布:爱福窝软件多少钱一年 编辑:程序博客网 时间:2024/06/05 05:32

Three Palindromes

                                                                  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
                                                                                          Total Submission(s): 1728    Accepted Submission(s): 611


Problem Description
Can we divided a given string S into three nonempty palindromes?
 

Input
First line contains a single integer T20 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
 

Output
For each case, output the "Yes" or "No" in a single line.
 

Sample Input
2abcabaadada
 

Sample Output
YesNo
 

Source
BestCoder Round #49 ($)
 

Recommend
hujie
 

题意:给你一个字符串,问能不能分为三个回文子串

解题思路:用Manachar计算以每个字符为中心的最长回文串长度,然后枚举头尾的回文串,判断中心是否为回文串


#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <cmath>#include <map>#include <cmath>#include <set>#include <stack>#include <queue>#include <vector>#include <bitset>#include <functional>using namespace std;#define LL long longconst int INF = 0x3f3f3f3f;char s1[20009], s2[40009];int p[40009];int a[40009], b[40009];int main(){int t;scanf("%d", &t);while (t--){scanf("%s", s1);s2[0] = '$';int len = 1, i = 0;while (s1[i]){s2[len++] = '#';s2[len++] = s1[i++];}s2[len++] = '#';s2[len] = '\0';memset(p, 0, sizeof p);int id = 0, ma = 0;for (int i = 0; i < len; i++){p[i] = ma > i ? min(p[id * 2 - i], ma - i) : 1;while (s2[i + p[i]] == s2[i - p[i]]) p[i]++;if (i + p[i] > ma){ma = i + p[i];id = i;}}int cnt1 = 0, cnt2 = 0;for (int i = 2; i < len - 1; i++){if (p[i] == i) a[cnt1++] = i;if (p[i] == len - i) b[cnt2++] = i;}int flag = 0;for (int i = 0; i < cnt1; i++){for (int j = 0; j < cnt2; j++){int l = a[i] + p[a[i]];int r = b[j] - p[b[j]];int mid = (l + r) >> 1;if (l > r || (l == r&&s2[mid] == '#')) continue;if (p[a[i]] * 2 - 1 + p[mid] * 2 - 1 + p[b[j]] * 2 - 1 >= len - 1) {flag = 1; break;}}if (flag) break;}if (flag) printf("Yes\n");else printf("No\n");}return 0;}

原创粉丝点击