【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. iOS学习笔记01-APP相关

    AppDelegate对象方法 # 程序第一次启动后才会执行 - (BOOL)application:(UIApplication *)application didFinishLaunchingWi ...

  2. HDU——1163Eddy's digital Roots(九余数定理+同余定理)

    Eddy's digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  3. [LOJ#516]「LibreOJ β Round #2」DP 一般看规律

    [LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...

  4. HDU-3729 I'm Telling the Truth

    一个点集是学生,一个点集是排名.然后通过学生的排名范围连线,求此二分图的最大匹配. 本题还要求是最大字典序输出,那么由贪心可得,你让标号从大到小找增广边就行了. #include <cstdli ...

  5. [USACO08DEC] 秘密消息Secret Message (Trie树)

    题目链接 Solution Trie 树水题. 直接将前面所有字符串压入Trie 中. 在查询统计路上所有有单词的地方和最后一个地方以下的单词数即可. Code #include<bits/st ...

  6. 百度网络监控实战:NetRadar横空出世(下)

    原文:https://mp.weixin.qq.com/s/CvCs-6rX8Lb5vSTSjYQaBg 转自订阅号「AIOps智能运维」,已授权运维帮转发 作者简介:运小贝,百度高级研发工程师 负责 ...

  7. bzoj 3924 幻想乡战略游戏

    题目大意: 有边权点权的树,动态修改点权 每次修改后求带权重心x (\(minimize\) \(S=\sum_i val[i]*dist[x][i]\)) 分析: 从暴力找突破口: 对于边x,y,设 ...

  8. POJ1167 The Buses

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6234   Accepted: 1698 Description A man ...

  9. 【CF314C】Sereja and Subsequences(DP,树状数组)

    题意:给定一个N个数的数列,求所有不同不下降子序列的乘积之和,其中不同指的是组成它的数字和长度不完全相同 n (1 ≤ n ≤ 10^5) a[i]<=10^6 思路:考虑DP.设DP[a[i] ...

  10. 如何用github展示前端页面

    如何在github上展示你的前端页面 参考:https://luozhihao.github.io/demo/ 感谢作者 1.New reposipory 2.进入你本机目录 我是在d:vuedemo ...