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)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文 ...
随机推荐
- 分类预测输出precision,recall,accuracy,auc和tp,tn,fp,fn矩阵
此次我做的实验是二分类问题,输出precision,recall,accuracy,auc # -*- coding: utf-8 -*- #from sklearn.neighbors import ...
- Float IP设置
浮动IP: 在做双机的时候,设定的一个IP,通过访问这个IP,具体到后台哪台机器,由系统指定. 浮动IP是随资源一起走的. 就是由软件根据具体情况把该IP设置在某一台机器上,对外提供服务 为了避免因为 ...
- JavaScript(三) - 精简
javascript 对象 1 什么是对象? 对象只是一种特殊的数据,对象拥有属性和方法. 2 对象有哪些? js中所有的事物都是对象:字符串,数值,数组,函数. js允许自定义对象.提供多个内建对象 ...
- canvas变换
canvas变换 方法 save() 保存canvas状态 restore() 回复canvas保存的状态 translate(x, y) 移动canvas位置 rotate(radians) 顺时针 ...
- MPI 派生数据类型 MPI_Type_create_struct(),MPI_Type_contiguous(),MPI_Type_vector(),MPI_Type_create_hvector(),MPI_Type_indexed()
▶ 使用 MPI 派生数据类型,减少数据在传输过程中的耗时 ● MPI_Type_create_struct() 范例代码 { ; int globalDataInt[globalSize], glo ...
- Firefox 被Snap.do 劫持
Firefox IE 被劫持 windows的控制面板,卸载程序, 找任何跟「Snap.do」有关的软件,找到後先移除「Snap.Do Engine」再移除「Snap.Do」. 注册表里查找 Snap ...
- Maven(六) eclipse 使用Maven deploy命令部署构建到Nexus
转载于:http://blog.csdn.net/jun55xiu/article/details/43051627 1 应用场景:SYS-UTIL(系统工具)项目部署.构建成JAR包(SYS-UT ...
- 迷你MVVM框架 avalonjs 0.84发布
本版本只要做了如下改进 重构ui绑定 fix scanTag bug ms-include 的值必须不为空值,否则不做任何操作.
- css常用属性总结:背景background上篇
1.在前面一节中我们提到了color的使用,类似于前景色,我们同样可以为元素的背景声明颜色,可以使用background-color属性, 它接受任何有效的颜色值.先看看它的语法. backgroun ...
- centos 搭建owncloud私有云
ownCloud是一个免费开源的软件,用于为分享文件,日历,联系人,书签和个人音频/视频.非常容易安装和管理. 1:搭建环境配置:你的服务应该工作在LAMP上.参考下面链接去安装一键LAMP服务. h ...