hdu5340 Three Palindromes(manacher算法)
题目描写叙述:
- 推断能否将字符串S分成三段非空回文串。
解题思路:
源码:
- #include <cstdio>
- #include <algorithm>
- #define MAXN 20010
- using namespace std;
- int n;
- char d[MAXN];///原始字符串
- char st[MAXN*2];///经过manacher处理之后的字符串
- int p[MAXN*2];///保存回文串半径,ps每一个回文串长度一定为奇数
- int ll[MAXN*2];///第一个回文串可能的全部半径
- int rr[MAXN*2];///第三个回文串可能的全部半径
- void manacher(){///manacher算法,能够去查询了解一下
- int i;
- st[0]='$';
- st[1]='#';
- for(i=1;d[i]!='\0';++i){
- st[i*2]=d[i];
- st[i*2+1]='#';
- }
- st[i*2]='\0';
- n=i*2-1;
- int MaxId=0,id;
- for(int i=1;i<=n;i++)
- {
- if(MaxId>i)
- p[i]=min(p[2*id-i],MaxId-i);
- else
- p[i]=1;
- while(st[i+p[i]]==st[i-p[i]])
- p[i]++;
- if(p[i]+i>MaxId){
- id=i;
- MaxId=p[i]+i;
- }
- }
- }
- int main(){
- int res;
- scanf("%d",&res);
- while(res--){
- scanf("%s",&d[1]);
- manacher();
- int l=0,r=0;
- for(int i=1;i<=n;i++){
- if(p[i]==i&&i!=1)///p[i]==i保证p[i]能够作为第一个回文串的半径,增加ll数组,i!=1保证第一个回文串不为空
- ll[l++]=p[i];
- if(p[i]+i-1==n&&i!=n)///与上面相似
- rr[r++]=p[i];
- }
- int i,j;
- for(i=l-1;i>=0;--i){
- for(j=0;j<=r-1;++j){///枚举第一个回文串和第三个回文串
- int tl=2*ll[i];///第二个字符串的開始位置
- int tr=n+1-2*rr[j];///第二个字符串的结束位置
- int tmp=(tl+tr)/2;///第二个字符串的中间位置,ps:这三个字符串都为奇数,能够自己想想
- if(tl>tr) continue;
- if(p[tmp]==1) continue;///第二个字符串为"#",也即是在原串中为空
- if(p[tmp]*2-1>=tr-tl+1)///以tmp为中点的回文串的长度大于等于第二个字符串的长度,符合题意跳出循环
- break;
- }
- if(j<=r-1)
- break;
- }
- if(i>=0)
- printf("Yes\n");
- else
- printf("No\n");
- }
- return 0;
- }
hdu5340 Three Palindromes(manacher算法)的更多相关文章
- hdu5340—Three Palindromes—(Manacher算法)——回文子串
Three Palindromes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- UVA 11584 Partitioning by Palindromes 划分回文串 (Manacher算法)
d[i]表示前面i个字符划分成的最小回文串个数, 转移:当第i字符加进来和前面区间j构成回文串,那么d[i] = d[j]+1. 要判断前面的字符j+1到i是不是回文串,可以用Manacher算法预处 ...
- manacher算法专题
一.模板 算法解析:http://www.felix021.com/blog/read.php?2040 *主要用来解决一个字符串中最长回文串的长度,在O(n)时间内,线性复杂度下,求出以每个字符串为 ...
- Codeforces Beta Round #7 D. Palindrome Degree manacher算法+dp
题目链接: http://codeforces.com/problemset/problem/7/D D. Palindrome Degree time limit per test1 secondm ...
- KMP 、扩展KMP、Manacher算法 总结
一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...
- Hash 算法与 Manacher 算法
目录 前言 简单介绍 简述 Hash 冲突 离散化 基本结构 普通 Hash 简述 例题 字符串 Hash 简单介绍 核心思想 基本运算 二维字符串 Hash 例题 兔子与兔子 回文子串的最大长度 后 ...
- HDU3068 回文串 Manacher算法
好久没有刷题了,虽然参加过ACM,但是始终没有融会贯通,没有学个彻底.我干啥都是半吊子,一瓶子不满半瓶子晃荡. 就连简单的Manacher算法我也没有刷过,常常为岁月蹉跎而感到后悔. 问题描述 给定一 ...
- lintcode最长回文子串(Manacher算法)
题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...
- 1089 最长回文子串 V2(Manacher算法)
1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 回文串是指aba.abba.cccbccc.aaaa ...
随机推荐
- ant 入门级详解
ant 入门级详解 [转载的地址(也是转载,未找到原文地址)]https://www.cnblogs.com/jsfx/p/6233645.html 1,什么是antant是构建工具2,什么是构建 ...
- wordpress 使用wp_head()函数
wp_head()的作用: 在WordPress主题中使用此函数控制<head>…</head>之间的标签内容. 以通过header.php模板文件输出html中的head标签 ...
- cobbler常用目录/命令(三)
常用目录: /var/www/cobbler/ks_mirror/ cobbler distro文件目录 /var/lib/tftpboot/pxelinux.cfg/d ...
- Linux Shell系列教程之(五)Shell字符串
本文是Linux Shell系列教程的第(五)篇,更多shell教程请看:Linux Shell系列教程 字符串是Shell编程中最常用最有用的数据类型,今天,Linux大学网就为大家介绍一下在She ...
- 【Luogu】P2303Longge的问题(莫比乌斯反演)
就让我这样的蒟蒻发一个简单易想的题解吧!!! 这题我一开始一看,woc这不是莫比乌斯反演么,推推推,推到杜教筛,输出结果一看不对 emmm回来仔细想想……woc推错了? 然后撕烤半天打了个暴力,A了 ...
- 【Luogu】P2765魔术球问题(没看懂的乱搞)
题目链接 这题……讲道理我没看懂. 不过我看懂题解的代码是在干嘛了qwq 题解是zhaoyifan的题解 然后……我来讲讲这个题解好了. 题解把值为i的球拆成了两个,一个编号是i*2,一个编号是i*2 ...
- scale out instead of scale up
Scale Out(也就是Scale horizontally)横向扩展,向外扩展Scale Up(也就是Scale vertically)纵向扩展,向上扩展无论是Scale Out,Scale Up ...
- 机器人程序设计——之如何正确入门ROS | 硬创公开课(附视频/PPT)【转】
转自:http://blog.exbot.net/archives/2966 导语:本期公开课面向想入手ROS却又不知从何下手的小伙伴,为大家梳理好学习思路. ROS和Android一样是开源的,功能 ...
- Scrapy学习-19-远程管理telnet功能
使用scrapy的telnet功能远程管理scrapy运行 用法 telnet <IP_ADDR> <PORT> 官方文档 https://doc.scrapy.org/en/ ...
- [List] C#数组学习
数组概述 C# 数组从零开始建立索引,即数组索引从零开始.C# 中数组的工作方式与在大多数其他流行语言中的工作方式类似.但还有一些差异应引起注意.声明数组时,方括号 ([]) 必须跟在类型后面,而不是 ...