hdu 5340 Three Palindromes
前几晚 BC 的第二题,官方给出的题解是:

然后我结合昨天刚看的 Manacher 算法试着写了下,发现 pre、suf 数组挺难构造的,调试了好久,然后就对中间进行枚举了,复杂度应该是 O(n2) 吧,我第一次交时超时了,以为真的要用什么暴力压位,可是我还不会啊,然后作了一些少许的优化提交本想再 T 一次的,没想到竟然神奇的过了,900+ms 水过,原来还是能卡过的……于是我把更多的细节进行优化,把 *2 和 /2 操作都改为移位运算,再提交时就下降到了 700+ms :-D
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = ; char s[N], s2[N << ];
int p[N << ];
bool pre[N], suf[N]; int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%s",s);
int n = strlen(s);
s2[] = '$';
s2[] = '#';
for(int i = ; i < n; ++i) {
s2[(i << ) + ] = s[i];
s2[(i << ) + ] = '#';
}
n = (n << ) + ;
s2[n] = '\0';
int right = , id = ;
p[] = ;
for(int i = ; i < n; ++i) {
if(right > i)
p[i] = min(p[(id << ) - i], right - i);
else p[i] = ;
while(s2[i + p[i] + ] == s2[i - p[i] - ]) ++p[i];
if(i + p[i] > right) {
right = i + p[i];
id = i;
}
} int slen = (n >> ) - ; for(int i = ; i < slen; ++i) {
int s2id = i + ;
pre[i] = (s2id - p[s2id] == );
}
for(int i = slen - ; i >= ; --i) {
int s2id = i + slen + ;
suf[i] = (s2id + p[s2id] == n - );
} bool flag = ;
for(int i = ; i <= n - ; ++i) {
int j = s2[i] == '#' ? : ;
for(; j <= p[i]; j += ) {
int id1 = i - j - ;
int id2 = i + j + ;
if(pre[(id1 >> ) - ] && suf[(id2 >> ) - ]) {
flag = ;
break;
}
}
if(flag) break;
}
puts(flag ? "Yes": "No");
}
return ;
}
hdu 5340 Three Palindromes的更多相关文章
- 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 ...
- HDU 5340 Three Palindromes (Manacher)
题意: 判断是否能将字符串S分成三段非空回文串. 思路: 先预处理出前缀回文串和后缀回文串的位置,将位置分别装入两个集合中,O(n). 针对每个前缀回文串的终点位置,挑出不相交的后缀回文串,对中间那段 ...
- hdu 5340 (manacher)
Sample Input 2 abc abaadada Sample Output Yes No 判断是否能成为3个非空回文子串 manacher算法求出个点回文长度,在找出第一个和最后一个保存下 ...
- 致初学者(二): HDU 2014~ 2032题解
下面继续给出HDU 2014~2032的AC程序,供大家参考.2014~2032这19道题就被归结为“C语言程序设计练习(三) ”~“C语言程序设计练习(五) ”. HDU 2014:青年歌手大奖赛_ ...
- 关于manacher
由一个题引入: 求一个串A的最长回文串: A=abababa最长回文串长度:5(ababa) 先思考用hash怎么做? 一.暴力 枚举左端,右端点(确定一个区间),线性扫一遍当前区间. Ans=max ...
- ___Manacher(线性回文子串处理算法)
昨晚的bc做得好忧郁----- 第一题改了好久好久好久----等改完发现比赛已经结束了(发现是枚举子集的位运算那儿写错了--) 第二题是判断能否将一个字符串划分成三段回文串 今天学了一点点 Mana ...
- hdu 1318 Palindromes(回文词)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1318 题意分析:输入每行包含一个字符串,判断此串是否为回文串或镜像串. 表面上看这道题有些复杂,如果能 ...
- HDU 2163 Palindromes
http://acm.hdu.edu.cn/showproblem.php?pid=2163 Problem Description Write a program to determine whet ...
随机推荐
- python :列表 字典 集合 类 ----局部变量可以改全局变量
#列表 字典 集合 类 ----局部变量可以改全局变量,除了整数和字符串 names=["alex","jack","luck"] def ...
- AGPS 常见的两种定位模式
SI 定位模式: 用户发起定位请求,辅助GPS 模块快速进行定位.时间在6秒-15秒之间. 这个方式能够有效的解决普通GPS 最快需要30秒时间获得卫星星历的搜星慢的问题,如果使用AGPS将通过中移动 ...
- YTU 2924: 文件操作--二进制文件读入
2924: 文件操作--二进制文件读入 时间限制: 1 Sec 内存限制: 128 MB 提交: 58 解决: 20 题目描述 现有100名学生的姓名(name).学号(num).英语(Engli ...
- jsp:和属性相关的方法,请求的转发,重定向
jsp中与属性相关的方法: 方法: void setAttribute(String name, Object o): 设置属性 Object getAttribute(String name):获取 ...
- Financial Management 分类: POJ 2015-06-11 10:51 12人阅读 评论(0) 收藏
Financial Management Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 164431 Accepted: ...
- nohup & rabbitmq & python
用Python脚本执行rabbitmq的消费 nohup python consumer.py > out.log & 结果郁闷啊,怎么都查看不到输出! 终于找到了答案: 原来pytho ...
- Linux crond定时任务
第1章 Crond是什么? Crond是linux系统用来定期执行命令或指定程序任务的一种服务或软件.一般情况下,我们安装完Centos5/6linux操作系统之后,默认便会启动Crond任务调度服务 ...
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛 A Simple Job
描述 Institute of Computational Linguistics (ICL), Peking University is an interdisciplinary institute ...
- Android OnTouchListener,OnClickListener和OnLongClickListener的关系
在OnTouchListener事件里有MotionEvent.ACTION_DOWN,MotionEvent.ACTION_UP和MotionEvent.ACTION_MOVE三个事件,我们在这里只 ...
- 加载页面(Loading)
/* 文件说明:页面加载时Loading JS 文件描述:解决IE或FF下,初始化加载时,页面布局乱掉的问题,参考:*/var width = $(window).width();var height ...