hdu5340—Three Palindromes—(Manacher算法)——回文子串
Three Palindromes
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1948 Accepted Submission(s): 687
For each test case , there is an single line contains a string S which only consist of lowercase English letters.1≤|s|≤20000
题意:给出一个字符串,问能否将字符串分为三段,并且每一段的是回文串。
思路:这题要用到manacher算法,不知道的可以看一下这篇博客:https://blog.csdn.net/dyx404514/article/details/42061017。
首先用manacher求出以每个点为中点的回文串的半径,然后,我们可以知道,要将字符串分为三段,那第一段一定包含第一个字符,第三段一定包含最后一个字符。然后判断第一个回文串和第三个之间剩下的字符是否构成回文串就行了。
所以,我们找到用manacher算法求出的所有回文串中,包含了第一个字符和和最后一个字符的有那些,然后两两配对,看看是否存在某一对,他们不重合,且之间剩下的字符也是回文串。
具体操作看代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#define eps 1e-7
#define ll long long
#define inf 0x3f3f3f3f
#define pi 3.141592653589793238462643383279
using namespace std;
const int maxn = ;
char a[maxn],s_new[maxn<<];
int s_len[maxn<<]; int Init() //manacher算法初始化(模板)
{
int len = strlen(a);
s_new[] = '@';
int j = ;
for(int i=; i<len; ++i) //在每个字符左右插入'#'
{
s_new[j++] = '#';
s_new[j++] = a[i];
}
s_new[j++] = '#';
s_new[j] = '\0';
return j;
} void manacher(int len) //计算以每个点为中心的回文串的半径(模板)
{
int high = ,flag = ;
for(int i=; i<len; ++i)
{
if(i < high)
s_len[i] = min(high-i+ , s_len[*flag-i]);
else
s_len[i] = ; while(s_new[i + s_len[i]] == s_new[i - s_len[i]])
s_len[i]++; if(i + s_len[i] - > high)
{
high = i+ s_len[i] -;
flag = i;
}
}
return;
} bool judge(int len) //判断是否可以分为3个回文串
{
int visit1[maxn<<], visit2[maxn<<], cnt1 = , cnt2 = ;
//visit1用来存储所有包含第一个字符的字符串的中点下标
//visit2用来存储包含最后一个字符串的中点下标 for(int i=; i<len; ++i) //遍历一遍,找到存入visit数组中
{//因为以 i 为中点的回文串的长度是s_len[i]-1,所以还要判断一下这个回文串长度是否为 0;
if(i - s_len[i] + == && s_len[i] - > )
visit1[cnt1++] = i;
if(i + s_len[i] - == len- && s_len[i] - > )
visit2[cnt2++] = i;
}
bool flag = false;
int mid;
for(int i=; i<cnt1; ++i) //for循环的嵌套用来让三段中,第一段和第三段两两配对
{
for(int j=cnt2-; j>=; --j)
{
if(visit1[i] + s_len[visit1[i]] - < visit2[j] - s_len[visit2[j]] + )
//选出的两段不能有重合,有重合表示中间没字符了
{
mid = ( (visit1[i] + s_len[visit1[i]] - ) + (visit2[j] - s_len[visit2[j]] + ) ) / ;
//然后取两段中间剩余字符的中点
if(mid - s_len[mid] + <= visit1[i] + s_len[visit1[i]] && s_len[mid]- > )
//判断以中点为中心的回文串是否完全覆盖了中间所有的字符
{
flag = true; //若覆盖了,则表示可以分成三段回文串
break; //就不需要再继续查找了
}
}
}
if(flag) break;
}
return flag;
} int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%s",a);
int len = Init();
manacher(len); bool T_or_F = judge(len);
if(T_or_F)
cout<<"Yes\n";
else
cout<<"No\n";
}
return ;
}
hdu5340—Three Palindromes—(Manacher算法)——回文子串的更多相关文章
- zoj 2744 Palindromes(计算回文子串个数的优化策略)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2744 题目描述: A regular palindrome i ...
- cf#516C. Oh Those Palindromes(最多回文子串的字符串排列方式,字典序)
http://codeforces.com/contest/1064/problem/C 题意:给出一个字符串,要求重新排列这个字符串,是他的回文子串数量最多并输出这个字符串. 题解:字典序排列的字符 ...
- manacher算法——回文串计算的高效算法
manacher算法的由来不再赘述,自行百度QWQ... 进入正题,manacher算法是一个高效的计算回文串的算法,回文串如果不知道可以给出一个例子:" noon ",这样应该就 ...
- 5. Longest Palindromic Substring(最长回文子串 manacher 算法/ DP动态规划)
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- 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 ...
- 51nod1089(最长回文子串之manacher算法)
题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...
- 求最长回文子串:Manacher算法
主要学习自:http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 问题描述:回文字符串就是左右 ...
- Manacher's algorithm: 最长回文子串算法
Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...
- 【转】最长回文子串的O(n)的Manacher算法
Manacher算法 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长.这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文 ...
随机推荐
- emacs里面模拟vim按键操作的插件evil
emacsConfig/evil-setting.el (setq evil-mode t) (setq evil-shift-width ) ;; some modes aren't meant f ...
- appium -ios 真机连接 环境搭建
补充点一: 安装ios-deploynpm install -g ios-deploy 安装不了报错.! 后来找了找,发现sudo npm install -g ios-deploy --unsafe ...
- HDU 1358 Period (kmp判断循环子串)
Period Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- 二货Mysql中设置字段的默认值问题
Mysql设置字段的默认值的确很落伍 1.不支持函数 2.只支持固定常量. 经常用到的日期类型,因为不支持getdate或者now函数,所以只能设置timestamp类型 而且还必须在默认值那个地方写 ...
- 给iOS开发新手送点福利,简述UIButton的属性和用法
UIButton属性 1.UIButton状态: UIControlStateNormal // 正常状态 UIControlStateHighlighted // 高 ...
- docker redis
https://www.cnblogs.com/cgpei/p/7151612.html 重启docker >systmctl restart docker >mkdir -p ~/red ...
- MySQL 触发器示例
简介: MySQL 触发器 这次实验是在一台 MySQL Slave 上进行的,事实证明:从库添加数据库.表.插入.删除数据等,不会导致主从失败. 一.创建实验数据库.表 mysql > cre ...
- Hive的安装和建表
目录 认识Hive 1. 解压 2. 配置mysql metastore(切换到root用户) 3. 配置hive 4. 安装hive和mysq完成后,将MySQL的连接jar包拷贝到$HIVE_HO ...
- node.js中的匿名函数, 回调函数和嵌套函数
定义一个函数相信大家已经很熟悉了, 在javascript里的函数也是非常重要的, 使用率非常高, 有几种函数不是很好理解 一, 匿名函数 var remove = function(num1) { ...
- win10如和设置远程桌面
最近几天一直在搞远程桌面问题,电脑一直连不上远程,今天终于出来了. 前提前提 条件,要电脑允许Administrator用户,先把电脑切换到那个用户,然后进行下面操作. 1.在桌面,我的电脑图标,鼠 ...