HDU 5340 Three Palindromes (Manacher)
题意:
判断是否能将字符串S分成三段非空回文串。
思路:
先预处理出前缀回文串和后缀回文串的位置,将位置分别装入两个集合中,O(n)。
针对每个前缀回文串的终点位置,挑出不相交的后缀回文串,对中间那段进行暴力匹配即可。只有20个case,不会超时的。
具体的算法参考HIHOCODER HIHO一下 第一周 #1032 : 最长回文子串 (特殊处理)
- //#include <bits/stdc++.h>
- #include <cstdio>
- #include <cstring>
- #include <map>
- #include <algorithm>
- #include <set>
- #include <string>
- #include <iostream>
- #include <deque>
- #include <vector>
- #define INF 0x7f7f7f7f
- #define pii pair<int,int>
- #define LL unsigned long long
- using namespace std;
- const int N=;
- int len; //原串长
- char str[N*]; //接收原来的串
- char s[N*];
- int P[N*]; //保存关于长度的信息(回文长度的一半再加1)
- vector<int> vect[];
- int cal(int q)
- {
- int id=, mx=, max1=;
- P[]=;
- P[]=;
- for(int i=; s[i]!='\0'; i++) //考虑以i为中心的回文串
- {
- P[i] =i>mx? : min( P[*id-i],mx-i);
- while(s[i+P[i]]==s[i-P[i]]) //在这比对
- {
- if(i-P[i]==) vect[q].push_back(i+P[i]); //已经匹配
- P[i]++;
- }
- if(i+P[i]>mx) //更新id和mx的位置
- {
- id=i;
- mx=i+P[i];
- }
- if(P[i]->max1) //更新最大值
- max1=P[i]-;
- }
- return max1;
- }
- bool ok()
- {
- len=strlen(str);
- sort(vect[].begin(), vect[].end());
- sort(vect[].begin(), vect[].end());
- for(int i=; i<vect[].size(); i++)//这里虽然穷举了所有可能,但通常都很少
- {
- for(int j=; j<vect[].size(); j++)
- {
- int l=vect[][i]+;
- int r=len-vect[][j]-;
- if(l>r) break;
- while( l<r && str[l]==str[r] )
- l++,r--;
- if(l==r && str[l]==str[r])
- return true;
- }
- }
- return false;
- }
- int main()
- {
- //freopen("input.txt", "r", stdin);
- int t;
- cin>>t;
- while(t--)
- {
- scanf("%s",str);
- len=strlen(str);
- vect[].clear();
- vect[].clear();
- if(len==)///特别处理
- {
- puts("YES");
- continue;
- }
- s[]='$';
- s[]='#';
- int i=, j=;
- for(; i<len; i++)
- {
- s[j++]=str[i];
- s[j++]='#';
- }
- s[j]='\0';
- strcpy(str,s);//先copy出一份拷贝
- memset(P, , sizeof(P));
- cal();
- reverse(s,s+*len+);//反置过来,求后缀回文
- s[]='$';
- s[*len+]='\0';
- memset(P, , sizeof(P));
- cal();
- if(ok())puts("Yes");
- else puts("No");
- }
- return ;
- }
AC代码
HDU 5340 Three Palindromes (Manacher)的更多相关文章
- HDU - 5340 Three Palindromes(manacher算法)
http://acm.hdu.edu.cn/showproblem.php?pid=5340 题意 判断是否能将字符串S分成三段非空回文串 分析 manacher预处理出前缀和后缀回文的位置, 枚举第 ...
- HDU 5340——Three Palindromes——————【manacher处理回文串】
Three Palindromes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 【SPOJ】NUMOFPAL - Number of Palindromes(Manacher,回文树)
[SPOJ]NUMOFPAL - Number of Palindromes(Manacher,回文树) 题面 洛谷 求一个串中包含几个回文串 题解 Manacher傻逼题 只是用回文树写写而已.. ...
- HDU 5938 Four Operations(四则运算)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 5775 Bubble Sort(冒泡排序)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- HDU 1176 免费馅饼 (动态规划)
HDU 1176 免费馅饼 (动态规划) Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼 ...
随机推荐
- HDU 2669 Romantic(扩展欧几里德, 数学题)
题目 //第一眼看题目觉得好熟悉,但是还是没想起来//洪湖来写不出来去看了解题报告,发现是裸的 扩展欧几里得 - - /* //扩展欧几里得算法(求 ax+by=gcd )//返回d=gcd(a,b) ...
- D&F学数据结构系列——AVL树(平衡二叉树)
AVL树(带有平衡条件的二叉查找树) 定义:一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树. 为什么要使用AVL树(即为什么要给二叉查找树增加平衡条件),已经在我之前的博文中说到过 ...
- 《Thinking in C++》学习笔记(一)【第二章】
第二章 对象的创建与使用 2.1语言的翻译过程 翻译器分为两类:解释器(interpreter)和编译器(compiler). 2.1.1解释器 解释器将源代码转化成一些动作(它可由许多机器指令组成) ...
- [读]剑指offer
研二的开始找工作了,首先祝愿他们都能够找到自己满意的工作.看着他们的身影,自问明年自己这个时候是否可以从容面对呢?心虚不已,赶紧从老严那儿讨来一本<剑指offer>.在此顺便将自己做题所想 ...
- iOS多线程的初步研究(九)-- dispatch源
dispatch源(dispatch source)和RunLoop源概念上有些类似的地方,而且使用起来更简单.要很好地理解dispatch源,其实把它看成一种特别的生产消费模式.dispatch源好 ...
- JS中基本类型与包装类型的关系
对于JS中一些类型的转化的东西,自己测试并得出的结论,有错误的地方请大大们留言. 不多废话,直接贴代码,测试请直接拷贝全部代码: <!DOCTYPE html> <html> ...
- 配置sshd_config中的PermitRootLogin设置root登录或者禁止root登录
在etc的sshd_config文件中,默认有PermitRootLogin no的配置,这个的意思是禁止root用户登录,如果想要允许root登录,需要su root用户到sshd_config下进 ...
- 李洪强iOS开发之多线程编程2-NSOperation
前言 1.上一讲简单介绍了NSThread的使用,虽然也可以实现多线程编程,但是需要我们去管理线程的生命周期,还要考虑线程同步.加锁问题,造成一些性能上的开销.我们也可以配合使用NSOperation ...
- lintcode: 左填充
题目 实现一个leftpad库,如果不知道什么是leftpad可以看样例 样例 leftpad("foo", 5) >> " foo" leftpa ...
- 545C. Woodcutters
题目链接 题意: n个树,在x1,x2,...,xn的位置,树的高度依次是h1,h2,...,hn 求的是当把树砍倒时候,不占用相邻树的位置,最大砍树个数 可向左 向右砍,即树向左向右倒,很显然 当树 ...