Three Palindromes

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1948    Accepted Submission(s): 687

Problem Description
Can we divided a given string S into three nonempty palindromes?
 
Input
First line contains a single integer T≤20 which denotes the number of test cases.

For each test case , there is an single line contains a string S which only consist of lowercase English letters.1≤|s|≤20000

 
Output
For each case, output the "Yes" or "No" in a single line.
 
 
Sample Input
2
abc
abaadada
 
 
Sample Output
Yes
No

题意:给出一个字符串,问能否将字符串分为三段,并且每一段的是回文串。

思路:这题要用到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算法)——回文子串的更多相关文章

  1. zoj 2744 Palindromes(计算回文子串个数的优化策略)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2744 题目描述: A regular palindrome i ...

  2. cf#516C. Oh Those Palindromes(最多回文子串的字符串排列方式,字典序)

    http://codeforces.com/contest/1064/problem/C 题意:给出一个字符串,要求重新排列这个字符串,是他的回文子串数量最多并输出这个字符串. 题解:字典序排列的字符 ...

  3. manacher算法——回文串计算的高效算法

    manacher算法的由来不再赘述,自行百度QWQ... 进入正题,manacher算法是一个高效的计算回文串的算法,回文串如果不知道可以给出一个例子:" noon ",这样应该就 ...

  4. 5. Longest Palindromic Substring(最长回文子串 manacher 算法/ DP动态规划)

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  5. lintcode最长回文子串(Manacher算法)

    题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...

  6. 1089 最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa ...

  7. 51nod1089(最长回文子串之manacher算法)

    题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...

  8. 求最长回文子串:Manacher算法

    主要学习自:http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 问题描述:回文字符串就是左右 ...

  9. Manacher's algorithm: 最长回文子串算法

    Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...

  10. 【转】最长回文子串的O(n)的Manacher算法

    Manacher算法 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长.这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文 ...

随机推荐

  1. WebHttpBinding.ReaderQuotas 无法设置或者无法点出来

    项目需要引用System.Runtime.Serialization.dll 才能设置各项值: binding.ReaderQuotas.MaxDepth = ; binding.ReaderQuot ...

  2. Bootstrap-CL:页面标题

    ylbtech-Bootstrap-CL:页面标题 1.返回顶部 1. Bootstrap 页面标题(Page Header) 页面标题(Page Header)是个不错的功能,它会在网页标题四周添加 ...

  3. Linux C 一些函数 所属头文件

    1. Linux中一些头文件的作用:<assert.h>:ANSI C.提供断言,assert(表达式)<glib.h>:GCC.GTK,GNOME的基础库,提供很多有用的函数 ...

  4. nginx正向代理访问百度地图API

    正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器这个代理服务器呢,他能访问那个我不能访问的网站于是我先连上代 ...

  5. docker field

  6. 10个免费的在线Markdown编辑器

    1. StackEdit StackEdit是一个很用特色的免费在线Markdown编辑器. 有一个非常不错的工具栏,可与云存储同步,以URL形式导入文件或者直接从硬盘打入.他还有一个亮点就是,可以减 ...

  7. mysql性能优化-慢查询分析、优化索引和配置【转】

    一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1)      max_connec ...

  8. Go Flow Control

    [Go Flow Control] 1.for没有(),必须有{}. 2.for的前后表达式可以为空. 3.没有while,for即是while. 4.无穷循环. 5.if没有(),必须有{}. 6. ...

  9. spring boot 2

    服务端验证: // 1.修改实体 @Min(value = 18,message = "必须大于18岁") private int age; // 2.修改add方法 @PostM ...

  10. 基于Bind实现的DNS正反向解析及主从DNS的配置

    一.什么是DNS? 1.1 简单的理解,Domain Name System,是互联网一项核心的服务,他作为一个桥梁可以将域名和IP地址相互因素的一个分布式数据库,能够使人更加方便的访问互联网,而不用 ...