HDU - 5340 Three Palindromes(manacher算法)
http://acm.hdu.edu.cn/showproblem.php?pid=5340
题意
判断是否能将字符串S分成三段非空回文串
分析
manacher预处理出前缀和后缀回文的位置, 枚举第一个回文串和第三个回文串,这样得到第二个回文串的区间,找中点,因为manacher处理后所有的回文串长度都是奇数,然后根据中点的回文半径判断中间部分是否回文即可, 复杂度o(n2)。至于n2复杂度为什么能水过去。。不是很懂
- #include<iostream>
- #include<cmath>
- #include<cstring>
- #include<queue>
- #include<vector>
- #include<cstdio>
- #include<algorithm>
- #include<map>
- #include<set>
- #define rep(i,e) for(int i=0;i<(e);i++)
- #define rep1(i,e) for(int i=1;i<=(e);i++)
- #define repx(i,x,e) for(int i=(x);i<=(e);i++)
- #define X first
- #define Y second
- #define PB push_back
- #define MP make_pair
- #define mset(var,val) memset(var,val,sizeof(var))
- #define scd(a) scanf("%d",&a)
- #define scdd(a,b) scanf("%d%d",&a,&b)
- #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
- #define pd(a) printf("%d\n",a)
- #define scl(a) scanf("%lld",&a)
- #define scll(a,b) scanf("%lld%lld",&a,&b)
- #define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
- #define IOS ios::sync_with_stdio(false);cin.tie(0)
- using namespace std;
- typedef long long ll;
- template <class T>
- void test(T a){cout<<a<<endl;}
- template <class T,class T2>
- void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
- template <class T,class T2,class T3>
- void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
- const int N = 1e6+;
- //const int MAXN = 210;
- const int inf = 0x3f3f3f3f;
- const ll INF = 0x3f3f3f3f3f3f3f3fll;
- const ll mod = ;
- int T;
- void testcase(){
- printf("Case #%d: ",++T);
- }
- const int MAXN = 4e4+;
- const int MAXM = ;
- char ma[MAXN],s[MAXN];
- int mp[MAXN];
- int pre[MAXN],suf[MAXN];
- void Manacher(int len){
- int l=;
- ma[l++]='$';
- ma[l++]='#';
- for(int i=;i<len;i++) ma[l++]=s[i],ma[l++]='#';
- ma[l]=;
- int mx=,id=;
- for(int i=;i<l;i++){
- mp[i]=mx>i?min(mp[*id-i],mx-i):;
- while(ma[i+mp[i]]==ma[i-mp[i]]) mp[i]++;
- if(i+mp[i]>mx){
- mx=i+mp[i];
- id=i;
- }
- }
- }
- int main() {
- #ifdef LOCAL
- freopen("in.txt","r",stdin);
- #endif // LOCAL
- int t;
- scd(t);
- while(t--){
- scanf("%s",s);
- int len = strlen(s);
- Manacher(len);
- int l=,r=;
- len=*len+;
- for(int i=;i<=len;i++){
- if(mp[i]==i&&i!=) pre[l++]=mp[i];
- //mp[i]==i保证mp[i]可以作为第一个回文串的半径,加入pre数组,i!=1保证第一个回文串不为空
- if(mp[i]+i-==len&&i!=len) suf[r++]=mp[i];
- }
- int i,j;
- for(i=l-;i>=;i--){
- for(j=;j<r;j++){
- int t1=*pre[i];
- int t2=len+-*suf[j];
- int tmp = (t1+t2)>>;
- if(t1>t2) continue;
- if(mp[tmp]==) continue;
- if(mp[tmp]*->=t2-t1+) break;
- }
- if(j<r) break;
- }
- if(i>=) puts("Yes");
- else puts("No");
- }
- return ;
- }
HDU - 5340 Three Palindromes(manacher算法)的更多相关文章
- hdu 5340 Three Palindromes
前几晚 BC 的第二题,官方给出的题解是: 然后我结合昨天刚看的 Manacher 算法试着写了下,发现 pre.suf 数组挺难构造的,调试了好久,然后就对中间进行枚举了,复杂度应该是 O(n2) ...
- hdu 3613"Best Reward"(Manacher算法)
传送门 题意: 国王为了犒劳立下战功的大将军Li,决定奖给Li一串项链,这个项链一共包含26中珠子"a~z",每种珠子都有 相应的价值(-100~100),当某个项链可以构成回文时 ...
- 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). 针对每个前缀回文串的终点位置,挑出不相交的后缀回文串,对中间那段 ...
- Manacher 算法(hdu 3068 && hdu 3294)
今天打算补前晚 BC 的第二题,发现要用到能在 O(n) 时间求最大回文子串长度的 Manacher 算法,第一次听,于是便去百度了下,看了大半天,总算能看懂了其思想,至于他给出的代码模板我没能完全看 ...
- hdu 3068 最长回文 manacher算法(视频)
感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...
- hdu5340—Three Palindromes—(Manacher算法)——回文子串
Three Palindromes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HDU 5371(2015多校7)-Hotaru's problem(Manacher算法求回文串)
题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列.该子序列分为三部分,第一部分与第三部分同样,第一部分与第二部分对称.假设存在求最长的符合这样的条件的序列. ...
- HDU 3068:最长回文(Manacher算法)
http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的 ...
随机推荐
- Resolve Missing artifact Issue in maven
https://jingyan.baidu.com/article/d621e8da0a5b192864913f79.html
- 安装rlwrap 的简单方法
1. 下载安装 epel包 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 2. 安装r ...
- number (1)eclipse 连接数据库报错 数据库信息不对导致的出错
- FICO基础知识(四)
What is the organizational structure for CO? Operating Concern 经营组织 Controlling Area 成本控制范围 Profit c ...
- python之设置控制台字体颜色
# 设置控制台输出字体颜色 # 格式:\033[显示方式;前景色;背景色m # 采用终端默认设置:\033[0m # 红色字体 print('\033[1;31m') print('*' * 10) ...
- echarts之简单的入门——【一】做个带时间轴的柱状统计图
百度Echarts 官网首页 http://echarts.baidu.com/ 配置项手册 http://echarts.baidu.com/option.html#title GL配置项手册 h ...
- C# 对象与JSON字符串互相转换的三种方式
C# 对象与JSON字符串互相转换的三种方式 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. 关于内存对象和JSON字符串的相互转换, ...
- Centos7下Zabbix3.4至Zabbix4.0的升级步骤
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Centos7下Zabbix3.4至Zabbix4.0的升级步骤 查看现在centos版本和zab ...
- 自学Aruba2.1-Aruba Web UI --Dashbord面板介绍
点击返回:自学Aruba之路 自学Aruba2.1-Aruba Web UI --Dashbord面板介绍 本文所有设计的的controller版本信息如下: Aruba7205 V6.4.4.16 ...
- [hgoi#2019/2/16t3]psolve
题目描述 Dustar有n道题目要做.他的月薪是m元. 由于题目是一流的难题,所以Dustar不得不找个人来帮(代)助(替)他写作业. 找人写作业不是免费的,但是他们能保证在一个月内做出任何题目.每做 ...