Manacher BestCoder Round #49 ($) 1002 Three Palindromes

题目传送门

 1 /*
 2     Manacher:该算法能求最长回文串,思路时依据回文半径p数组找到第一个和第三个会文串,然后暴力枚举判断是否存在中间的回文串
 3     另外,在原字符串没啥用时可以直接覆盖,省去一个数组空间,位运算 >>1 比 /2 速度快,用了程序跑快200ms左右,位运算大法好
 4 */
 5 /************************************************
 6 Author        :Running_Time
 7 Created Time  :2015-8-1 20:10:22
 8 File Name     :B.cpp
 9 *************************************************/
10
11 #include <cstdio>
12 #include <algorithm>
13 #include <iostream>
14 #include <sstream>
15 #include <cstring>
16 #include <cmath>
17 #include <string>
18 #include <vector>
19 #include <queue>
20 #include <deque>
21 #include <stack>
22 #include <list>
23 #include <map>
24 #include <set>
25 #include <bitset>
26 #include <cstdlib>
27 #include <ctime>
28 using namespace std;
29
30 typedef long long ll;
31 const int MAXN = 2e4 + 10;
32 const int INF = 0x3f3f3f3f;
33 const int MOD = 1e9 + 7;
34 char s[MAXN*2];
35 int p[MAXN*2], fi[MAXN*2], ei[MAXN*2];
36 int len;
37
38 void Manacher(void) {
39     for (int i=len; i>=0; --i)  {
40         s[i*2+2] = s[i];    s[i*2+1] = ‘#‘;
41     }
42     s[0] = ‘$‘; len = len * 2 + 2;
43     int id = 0; p[0] = 1;
44     for (int i=2; i<len; ++i)   {
45         if (id + p[id] > i) p[i] = min (p[2*id-i], id + p[id] - i);
46         else    p[i] = 1;
47         while (s[i-p[i]] == s[i+p[i]])  p[i]++;
48         if (id + p[id] < i + p[i])  id = i;
49     }
50 }
51
52 bool judge(void) {
53     int c1 = 0, c2 = 0;
54     for (int i=2; i<len-1; ++i) {
55         if (p[i] == i)  fi[++c1] = i;
56         if (i + p[i] == len)    ei[++c2] = i;
57     }
58     for (int i=1; i<=c1; ++i)   {
59         for (int j=1; j<=c2; ++j)   {
60             int l = fi[i] + p[fi[i]];
61             int r = ei[j] - p[ei[j]];
62             if (l > r)  continue;
63             int mid = (l + r) >> 1;
64             if (p[mid] > (r - l + 1) >> 1)   return true;
65         }
66     }
67     return false;
68 }
69
70 int main(void)    {       //BestCoder Round #49 ($) 1002 Three Palindromes
71     int T;  scanf ("%d", &T);
72     while (T--) {
73         scanf ("%s", s);
74         len = strlen (s);
75         if (len < 3)    {
76             puts ("NO");    continue;
77         }
78         Manacher ();
79         judge () ? puts ("Yes") : puts ("No");
80     }
81
82     return 0;
83 }
时间: 2024-12-18 00:04:54

Manacher BestCoder Round #49 ($) 1002 Three Palindromes的相关文章

BestCoder Round #4 1002

这题真是丧心病狂,引来今天的hack狂潮~ Miaomiao's Geometry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 10    Accepted Submission(s): 3 Problem Description There are N point on X-axis . Miaomiao would like t

HDU BestCoder Round #1 1002 项目管理

项目管理 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! 两个节点间可能有多条边,不过一条边的两端必然是不同的节点. 每个节点都有一个能量值. 现在我们

贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

题目传送门 1 /* 2 贪心/二分查找:首先对ai%=p,然后sort,这样的话就有序能使用二分查找.贪心的思想是每次找到一个aj使得和为p-1(如果有的话) 3 当然有可能两个数和超过p,那么an的值最优,每次还要和an比较 4 注意:不能选取两个相同的数 5 反思:比赛时想到了%p和sort,lower_bound,但是还是没有想到这个贪心方法保证得出最大值,还是题目做的少啊:( 6 */ 7 #include <cstdio> 8 #include <algorithm>

HDU 5281 BestCoder Round #47 1002:Senior&#39;s Gun

Senior's Gun Accepts: 235 Submissions: 977 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 学姐姐是一个酷酷的枪手. 她常常会随身携带n把枪,每把枪有一个攻击力a[i]. 有一天她遇到了m只怪兽,每只怪兽有一个防御力b[j].现在她决定用手中的枪消灭这些怪兽. 学姐姐可以用第i把枪消灭第j只怪兽当且仅当b[j]≤a[i],同时她会获

矩阵快速幂---BestCoder Round#8 1002

当要求递推数列的第n项且n很大时,怎么快速求得第n项呢?可以用矩阵快速幂来加速计算.我们可以用矩阵来表示数列递推公式比如fibonacci数列 可以表示为 [f(n)   f(n-1)] = [f(n-1)    f(n-2)] [ 1 1 ]     [ 1 0 ] 设A = [ 1 1 ]  [ 1 0 ] [f(n)   f(n-1)] = [f(n-2)   f(n-3)]*A*A[f(n)   f(n-1)] = [f(2)   f(1)]*A^(n-2)矩阵满足结合律,所以先计算A^

二分图判定+点染色 BestCoder Round #48 ($) 1002 wyh2000 and pupil

题目传送门 1 /* 2 二分图判定+点染色:因为有很多联通块,要对所有点二分图匹配,若不能,存在点是无法分配的,no 3 每一次二分图匹配时,将点多的集合加大最后第一个集合去 4 注意:n <= 1,no,两个集合都至少有一人:ans == n,扔一个给另一个集合 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #include <cmath> 10 #in

暴力+降复杂度 BestCoder Round #39 1002 Mutiple

题目传送门 1 /* 2 设一个b[]来保存每一个a[]的质因数的id,从后往前每一次更新质因数的id, 3 若没有,默认加0,nlogn复杂度: 4 我用暴力竟然水过去了:) 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <cstring> 9 #include <string> 10 #include <algorithm> 11 using namespace std;

BestCoder Round #1 1002 项目管理 (HDU 4858)

项目管理 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 738    Accepted Submission(s): 260 Problem Description 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的!两个节点间可能有多条边,不过一条边的两端必然是不同的节点.每个节点都有一个能量值. 现在我

BestCoder Round #49

呵呵哒,1001的dfs返回值写错,wa了两发就没分了,1002显然是PAM可是我没学过啊!!!压位暴力可不可以...看看范围貌似不行,弃疗...1003根本不会做,1004想了想lcc发现不可做,那就是仙人掌分治,没写完囧... 最后Rating+69滚粗了... 官方题解: 1001 Untitled 对于一组可能的答案cc,如果先对一个觉小的c_ic?i??取模,再对一个较大的c_jc?j??取模,那么这个较大的c_jc?j??肯定是没有用的.因此最终的答案序列中的cc肯定是不增的.那么就