【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> # ...
随机推荐
- [错误解决]UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
python2内容无法写入csv,报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordin ...
- PHP协程是通过生成器实现的,这里测试了PHP生成器的一些特性
学习PHP的生成器,测试了一些特性.代码如下: function gen() { $name = (yield 'hello'); $nickname = (yield 'world'); yield ...
- python调用C/C++动态链接库和jython
总结(非原创) Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可. 1. C语言文件:pycall.c #include <stdio.h> ...
- 刷题总结——拆网线(noip模拟 贪心)
题目: 给定一颗树··在保证有k个点与其它点连接的情况下问最少保留多少条边···· 树的节点树n和k均小于100000: 题解: 很容易看出来我们要尽量保留那种一条边连两个节点的情况···· 然后考试 ...
- [USACO08DEC] 秘密消息Secret Message (Trie树)
题目链接 Solution Trie 树水题. 直接将前面所有字符串压入Trie 中. 在查询统计路上所有有单词的地方和最后一个地方以下的单词数即可. Code #include<bits/st ...
- axis2生成webservice服务端返回String[]和String[][]一维数组和二维数组解析
环境:用axis2生成服务端,用aixs做客户端 1:直接返回String[]: public String[] testArr(String name) { String[] ret=new Str ...
- kubernetes安装kubectl和minikube
安装kubectl命令 curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v1.10.0/bin/l ...
- UVa11021 Tribles
概率 递推 每只麻球都是独立计算的. 可以递推,设f[i]表示一只麻球经过i天死光的概率,那么f[i]的k次方就是k只麻球经过i天死光的概率. 则f[i]=p[0]+p[1]*f[i-1]^1+p[2 ...
- 【CF1028C】Rectangles(线段树)
题意: n<=1e5,abs(x[i]),abs(y[i]<=1e9 思路:这是正解 离散后线段树强打,数据结构越学越傻 #include<cstdio> #include&l ...
- vue2 父子组件间通信
父组件往子组件传值 props 传text father.vue <template> <div class="father"> {{'我是父组件'}} & ...