【HDOJ 5371】 Hotaru’s problem

Manacher算法+穷举/set

Manacher算法一好文:http://blog.csdn.net/yzl_rex/article/details/7908259

套一个Manacher算出回文半径数组p之后 有两种方法

穷举法:

枚举-1的点(依据题意仅仅必为偶数回文) 找在该点回文半径内与其相隔最远 而且回文半径等于他俩距离(即两点为中心的回文串同样) 的点 记录找到时的距离 不断枚举找最大值即为最大回文串长 串长/2*3即为答案

set法:

记录-1的位置 依据每一个-1相应的回文半径排序 从大到小枚举增加set 每增加一个位置i后 查找大于i-p[i]的第一个数(lower_bound) 和小于等于i+p[i]的第一个数(–upper_bound) 该位置与这两个位置的距离即为各自组成的回文串长度的二分之中的一个 找到最大的*3即为答案

代码例如以下:

//穷举
#include <iostream>
#include <cstdio>
#include <cstdlib> using namespace std; int nwm[200002];
int p[200002]; void Manacher(int n)//马拉车模板
{
nwm[0] = -2;
int i;
for(i = 0; i < n; i++)
{
nwm[i*2+1] = -1;
scanf("%d",&nwm[i*2+2]);
}
nwm[n*2+1] = -1;
nwm[n*2+2] = -3;
int maxid = 0,id;
n = n*2+2;
for(i = 2; i < n; ++i)
{
if(maxid > i) p[i] = min(p[id*2-i],maxid-i);
else p[i] = 1; while(nwm[i+p[i]] == nwm[i-p[i]]) p[i]++; if(p[i]+i > maxid)
{
maxid = p[i]+i;
id = i;
}
}
} int main()
{
int t,n,z = 0,i,mm,x;
scanf("%d",&t);
while(t--)
{
mm = 0;
scanf("%d",&n);
Manacher(n); for(i = 3; i +4< n*2+2; i+=2)//枚举-1
{
if(p[i]-1 > mm)
{
x = p[i]-1;//记录-1为中心的最大回文串长
while(x > mm && p[i+x] < x)//枚举找满足题意的第二回文中心
x--;
mm = max(mm,x);
}
} printf("Case #%d: %d\n",++z,mm/2*3);
}
return 0;
}
//set方法
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <set>
#include <algorithm> using namespace std; int nwm[200002];
int p[200002];
int id[200002],tp;
set <int> s; void Manacher(int n)
{
nwm[0] = -2;
int i;
for(i = 0; i < n; i++)
{
nwm[i*2+1] = -1;
id[tp++] = i*2+1;//将-1位置记录
scanf("%d",&nwm[i*2+2]);
}
nwm[n*2+1] = -1;
nwm[n*2+2] = -3;
int maxid = 0,id;
n = n*2+2;
for(i = 2; i < n; ++i)
{
if(maxid > i) p[i] = min(p[id*2-i],maxid-i);
else p[i] = 1; while(nwm[i+p[i]] == nwm[i-p[i]]) p[i]++; if(p[i]+i > maxid)
{
maxid = p[i]+i;
id = i;
}
}
} bool cmp(int a,int b)//按-1相应回文距离由大到小排序
{
return p[a] > p[b];
} int main()
{
int t,n,z = 0,i,mm,x,l,r; scanf("%d",&t);
while(t--)
{
s.clear();
tp = 0;
mm = 0;
scanf("%d",&n);
Manacher(n);
sort(id,id+tp,cmp);
for(i = 0; i < tp; ++i)//回文距离从大到小枚举位置
{
s.insert(id[i]);
l = *s.lower_bound(id[i]-p[id[i]]);//找左边第一个>=id[i]-p[id[i]]的位置
r = *(--s.upper_bound(id[i]+p[id[i]]));//找右边第一个<=id[i]+p[id[i]]的位置
mm = max(mm,max(id[i]-l,r-id[i]));
}
printf("Case #%d: %d\n",++z,mm/2*3);
} return 0;
}

【HDOJ 5371】 Hotaru&#39;s problem的更多相关文章

  1. 【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)

    pid=5654">[HDOJ 5654] xiaoxin and his watermelon candy(离线+树状数组) xiaoxin and his watermelon c ...

  2. 【HDOJ 2255】奔小康赚大钱(KM算法)

    [HDOJ 2255]奔小康赚大钱(KM算法) 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  3. 【HDOJ 5379】 Mahjong tree

    [HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...

  4. 【HDOJ 2089】不要62

    [HDOJ 2089]不要62 第一个数位dp的题 做的老困难了...只是好歹是做出来了 迈出了第一步.. 对大牛来说这样的题都是小case ps:新上一个记忆化方法 一些绕弯的题里用dfs好想些 代 ...

  5. 【HDOJ 5399】Too Simple

    pid=5399">[HDOJ 5399]Too Simple 函数映射问题 给出m函数 里面有0~m个函数未知(-1) 问要求最后1~n分别相应仍映射1~n 有几种函数写法(已给定的 ...

  6. 【HDOJ 3652】B-number

    [HDOJ 3652]B-number 给一整数n 找<=n的整数中能被13整除且含有13的 数位dp 记忆化! . 一入记忆化深似海. ..再也不想用递推了...发现真的非常好想 仅仅要保证满 ...

  7. 【HDOJ 5419】 Victor and Toys (排列组合)

    [HDOJ 5419] Victor and Toys n个玩具 m个区间 每一个玩具有一个beauty值 问任选三个区间 三区间的MINleft~MAXright的和的期望值 预处理一个数组 存放每 ...

  8. 【HDOJ 1009】 CRB and String

    [HDOJ 1009] CRB and String 每组两个串s t 仅仅由小写字母组成 问从s能不能变成t 改变的操作为选一个字符 在后面加上一个与所选字符不同的字符 这样的操作能够做无数次 问能 ...

  9. 【HDOJ 2063】过山车

    [HDOJ 2063]过山车 二分图最大匹配模板题 1女对n男 问匹配最大对数 代码例如以下: #include <iostream> #include <cstdlib> # ...

随机推荐

  1. ACM-ICPC 2018 沈阳赛区网络预赛 J树分块

    J. Ka Chang Given a rooted tree ( the root is node 11 ) of NN nodes. Initially, each node has zero p ...

  2. ACM程序设计选修课——1043: Radical loves integer sequences(YY)

    1043: Radical loves integer sequences Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 36  Solved: 4 ...

  3. BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组

    考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...

  4. node命令行开发

    node命令行开发比较出名的就是commander和yargs,以及inquirer,但是很少有文章将三个模块进行对比. 这里简单的描述一下: 1. commander直观,易上手,但是功能较弱,没有 ...

  5. 学习 WebService 第五步:在Local创建测试用WebService(WSDL)

    [准备] Eclipse+Tomcat7(Tomcat端口修改为不冲突的值) axis2 1.7.7 jar包(没有来这里下载:http://www.apache.org/dyn/closer.lua ...

  6. es6总结(四)--对象

  7. jquery 同源跨域请求整理

    //同源ajax请求数据 function getData(url,paramjson,fn) { $.ajax({ type : "POST", //提交方式 url : url ...

  8. C++的静态联编和动态联编详解

    一.概述: 通常来说联编就是将模块或者函数合并在一起生成可执行代码的处理过程,同时对每个模块或者函数调用分配内存地址,并且对外部访问也分配正确的内存地址,它是计算机程序彼此关联的过程.按照联编所进行的 ...

  9. Mysql让主键归0

    Mysql 相关技术 1.Mysql 让主键 归0: TRUNCATE TABLE * 2.只清空数据表,主键不归0: DELETE FROM 'TABLE' 3.重启数据库: /etc/init.d ...

  10. 在 .Net Core xUnit test 项目中使用配置文件

    在对项目做集成测试的时候,经常会需要用到一些参数比如用户名密码等,这些参数不宜放在测试代码中.本文介绍一种方法:使用配置文件. 添加配置文件 在集成测试项目目录下新建文件:Configuration. ...