【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's problem的更多相关文章
- 【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)
pid=5654">[HDOJ 5654] xiaoxin and his watermelon candy(离线+树状数组) xiaoxin and his watermelon c ...
- 【HDOJ 2255】奔小康赚大钱(KM算法)
[HDOJ 2255]奔小康赚大钱(KM算法) 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 【HDOJ 5379】 Mahjong tree
[HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...
- 【HDOJ 2089】不要62
[HDOJ 2089]不要62 第一个数位dp的题 做的老困难了...只是好歹是做出来了 迈出了第一步.. 对大牛来说这样的题都是小case ps:新上一个记忆化方法 一些绕弯的题里用dfs好想些 代 ...
- 【HDOJ 5399】Too Simple
pid=5399">[HDOJ 5399]Too Simple 函数映射问题 给出m函数 里面有0~m个函数未知(-1) 问要求最后1~n分别相应仍映射1~n 有几种函数写法(已给定的 ...
- 【HDOJ 3652】B-number
[HDOJ 3652]B-number 给一整数n 找<=n的整数中能被13整除且含有13的 数位dp 记忆化! . 一入记忆化深似海. ..再也不想用递推了...发现真的非常好想 仅仅要保证满 ...
- 【HDOJ 5419】 Victor and Toys (排列组合)
[HDOJ 5419] Victor and Toys n个玩具 m个区间 每一个玩具有一个beauty值 问任选三个区间 三区间的MINleft~MAXright的和的期望值 预处理一个数组 存放每 ...
- 【HDOJ 1009】 CRB and String
[HDOJ 1009] CRB and String 每组两个串s t 仅仅由小写字母组成 问从s能不能变成t 改变的操作为选一个字符 在后面加上一个与所选字符不同的字符 这样的操作能够做无数次 问能 ...
- 【HDOJ 2063】过山车
[HDOJ 2063]过山车 二分图最大匹配模板题 1女对n男 问匹配最大对数 代码例如以下: #include <iostream> #include <cstdlib> # ...
随机推荐
- 2016湖南省赛----G - Parenthesis (括号匹配)
2016湖南省赛----G - Parenthesis (括号匹配) Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of lengt ...
- 【Luogu】P2634聪聪可可(树形DP)
题目链接 水题,时限放得非常宽,暴力DP随便套上一波register就能卡过去. 唯一的遗憾是5A. 树形DP,s[i][j]表示以i为根的子树里距i的距离%3=j的点数,f[i]表示i为根的子树内一 ...
- formData使用总结
1.formData基本使用 //可以从form元素初始化一个FormData对象,或者new一个空对象 var formData = new FormData([fromElement]); //可 ...
- 浅谈Android反调试 之 PTRACE_TRACEME
反调试原理: 关于Ptrace: http://www.cnblogs.com/tangr206/articles/3094358.html ptrace函数 原型为: #include & ...
- bzoj1433 [ZJOI2009]假期的宿舍 最大流
[ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3429 Solved: 1459[Submit][Status][D ...
- ZOJ 3772 Calculate the Function 线段树+矩阵
Calculate the Function Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %ll ...
- 几个类和Table的方法
public class TableHelper { public static DataTable CreateTableFromClass(Type t) { DataTable dt = new ...
- LOJ#2303. 「NOI2017」蚯蚓排队
$n \leq 200000$的$1 \leq a_i \leq 6$的蚯蚓,有三种操作:让一只队头蚯蚓接在一只队尾蚯蚓后面:让一队蚯蚓从某个蚯蚓后面断成两队:问:给个字符串,问他的..算了你们直接看 ...
- vs nuget package control.
关于nuget,貌似使用nuget获取的package会在项目解决方案根目录下面将所有download下来的依赖包存储下来,所以这里的package会是最后所有的引用所在,既然不自己维护dll库的位置 ...
- 学习javascript设计模式之代理模式
1.代理模式为一个对象提供一个代用品或占位符,以便控制对它的访问. 2.不用代理模式: 客户 -> 本体 使用代理模式: 客户 -> 代理 -> 本体 3.例子场景1 点击操作与 ...