【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. 【bzoj4319】cerc2008 Suffix reconstruction 贪心

    题目描述 话说练习后缀数组时,小C 刷遍 poj 后缀数组题, 各类字符串题闻之丧胆.就在准备对敌方武将发出连环杀时,对方一记无中生有,又一招顺手牵羊,小C 程序中的原字符数组就被牵走了.幸运的是,小 ...

  2. jQuery全屏滚动插件fullPage.js使用中遇到的问题(滑动轮播效果无效)

    1.fullPage.js是什么? fullPage.js 是一个基于 jQuery ,用来制作全屏网站的插件. 2.兼容性: - jquery兼容:兼容 jQuery 1.7+ - 浏览器兼容: I ...

  3. HDU——1874畅通工程续(Dijkstra与SPFA)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  4. 视频流传输协议RTP/RTCP/RTSP/HTTP的区别 (转)

    用一句简单的话总结:RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.之所以以前对这几个有点分不清,是因为CTC标准里没有对RTCP进行要求,因此在标准RTSP的代码中 ...

  5. XMPP协议实现原理介绍(转)

    XMPP协议简介   XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM(IM:instant messagi ...

  6. IPC 通信接口函数的名字

      IPC三种通信机制是指:信号量.共享内存.消息队列 ,管道和命名管道,socket套接字    信号量:通过操作系统中的PV操作来实现: 共享内存:申请一块内存,进程A往共享内存中写,其他的进程就 ...

  7. C/C++程序编译运行过程分析(转载)

    为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母.符号串来替代一个特定的指令的二进制串,比如,用“A D D”代表加法,“M O V”代表数据传递等等,这样一来,人们很容 ...

  8. hdu 2462(欧拉定理+高精度快速幂模)

    The Luckiest number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. AC日记——总分 Score Inflation 洛谷 P2722

    题目背景 学生在我们USACO的竞赛中的得分越多我们越高兴. 我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助 题目描述 我们可以从几个种类中选取竞赛的题目,这里的一个"种类& ...

  10. HDU - 3664 Permutation Counting

    Discription Given a permutation a1, a2, … aN of {1, 2, …, N}, we define its E-value as the amount of ...