找出紧挨的三个回文串,例如abccbaabc ,形如ABA格式,其中AB为回文串。计算最长的长度。

首先用Manacher处理回文半径。然后就是找到两个点,都是偶数的回文串,并且共享了中间一段。

之后拿set搞一下就可以了= =

 #include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue> using namespace std; const int maxn = 1e5+;
int Ma[maxn<<],Mp[maxn<<];
set <int> pos; struct node{
int mp,p;
node(){}
bool operator < (const node &rhs) const
{
if(mp == rhs.mp) return p > rhs.p;
else return mp < rhs.mp;
}
}; priority_queue<node> pq;
void Manacher(int s[],int len)
{
int l = ;
Ma[l++] = '$';
Ma[l++] = '#';
for(int i=;i<len;i++)
{
Ma[l++] = s[i];
Ma[l++] = '#';
}
Ma[l] = ;
int mx = ,id = ;
for(int i=;i<l;i++)
{
Mp[i] = mx > i? min(Mp[*id-i],mx-i) : ;
while(Ma[i + Mp[i]] == Ma[i-Mp[i]]) Mp[i]++;
if(Mp[i] + i > mx)
{
mx = Mp[i] + i;
id = i;
}
}
} int T,N;
int save[maxn];
int main()
{
scanf("%d",&T);
int cas = ;
while(T--)
{
scanf("%d",&N);
for(int i=;i<N;i++) scanf("%d",&save[i]);
Manacher(save,N);
int ans = ;
node tmp;
while(!pq.empty()) pq.pop();
pos.clear();
for(int i=;i<*N+;i++)
{
if(Ma[i] == '#' && Mp[i] > )
{
tmp.mp = Mp[i];
tmp.p = i;
pq.push(tmp);
}
}
int cnt = ;
//for(int i=0;i<2*N+1;i++) printf("%d\t",i); puts("");
//for(int i=0;i<2*N+1;i++) printf("%c\t",Ma[i]=='#'?'#':Ma[i]+'0'); puts("");
//for(int i=0;i<2*N+1;i++) printf("%d\t",Mp[i]); puts("");
while(!pq.empty())
{
tmp = pq.top(); pq.pop();
int cur = tmp.p,mp = tmp.mp;
//printf("cur:%d mp:%d\n",cur,mp);
int tmp_pos = ;
if(cnt)
{
auto it = pos.lower_bound(cur - (mp-) ); //printf("L:%d ",*it);
if(it != pos.end() && *it >= cur-(mp-)) ans = max(ans,cur-*it); it = pos.lower_bound(cur + (mp-) ); it--;
//printf("R:%d\n",*it);
if(it != pos.end() && *it <= cur+(mp-)) ans = max(ans,*it-cur);
}
pos.insert(cur);
cnt++;
}
printf("Case #%d: %d\n",++cas,ans/*);
}
}

HDU5384-Hotaru's problem-Manacher的更多相关文章

  1. Hdu 5371 Hotaru's problem (manacher+枚举)

    题目链接: Hdu 5371 Hotaru's problem 题目描述: 给出一个字符串N,要求找出一条N的最长连续子串.这个子串要满足:1:可以平均分成三段,2:第一段和第三段相等,3:第一段和第 ...

  2. HDU 5371 Hotaru's problem Manacher+尺取法

    题意:给你一个序列,求最长的两段回文子串,要求他们共用中间的一半. 思路:利用Manacher求出p[i]表示的当前位置的最长回文串长度,然后把每一个长度大于等于2的回文串的左区间和右区间分别放到两个 ...

  3. HDU 5371——Hotaru's problem——————【manacher处理回文】

    Hotaru's problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  4. Manacher HDOJ 5371 Hotaru's problem

    题目传送门 /* 题意:求形如(2 3 4) (4 3 2) (2 3 4)的最长长度,即两个重叠一半的回文串 Manacher:比赛看到这题还以为套个模板就行了,因为BC上有道类似的题,自己又学过M ...

  5. Hotaru's problem

    Hotaru's problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  6. [2015hdu多校联赛补题]hdu5371 Hotaru's problem

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5371 题意:把一个数字串A翻过来(abc翻过来为cba)的操作为-A,我们称A-AA这样的串为N-se ...

  7. 2015 Multi-University Training Contest 7 hdu 5371 Hotaru's problem

    Hotaru's problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  8. HDU 5371 Hotaru's problem (Manacher,回文串)

    题意:给一个序列,找出1个连续子序列,将其平分成前,中,后等长的3段子序列,要求[前]和[中]是回文,[中]和[后]是回文.求3段最长为多少?由于平分的关系,所以答案应该是3的倍数. 思路:先Mana ...

  9. HDU 5371 Manacher Hotaru's problem

    求出一个连续子序列,这个子序列由三部分ABC构成,其中AB是回文串,A和C相同,也就是BC也是回文串. 求这样一个最长的子序列. Manacher算法是在所有两个相邻数字之间插入一个特殊的数字,比如- ...

  10. HDU 5371(2015多校7)-Hotaru&#39;s problem(Manacher算法求回文串)

    题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列.该子序列分为三部分,第一部分与第三部分同样,第一部分与第二部分对称.假设存在求最长的符合这样的条件的序列. ...

随机推荐

  1. [C#] LINQ之GroupBy

    声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 本文作者文采欠佳,文字表达等方面不是很好,但实际的代码例子是非常实用的,请作参考. 一.先准备要使用的类: 1.Person类: cl ...

  2. pycharm设置pytest运行程序

  3. 软工网络15团队作业8——Beta阶段敏捷冲刺

    Deadline: 2018-5-31 22:00PM,以博客提交至班级博客时间为准 根据以下要求: (1)在敏捷冲刺前发布一篇博客,作为beta版敏捷冲刺的开始, (2)同时,团队在日期区间[5.2 ...

  4. Python之缩进块

    pycharm编辑器识别冒号,当换行后下一行默认是缩进块的位置:

  5. C# 和 c++的语法不同点

    GC  Garbage Collection 垃圾回收器 自动释放资源 关键字: new 1.创建对象 2.隐藏从父类继承的同名函数 using 1.引用命名空间 2. using(FileStrea ...

  6. laravel belongsTo使用

    前提:订单表(order)和用户表(user) 表结构: order CREATE TABLE `order` ( `id` char(16) COLLATE utf8mb4_unicode_ci N ...

  7. JavaScript charAt() 方法

    <script> var str="abcdef"; alert(str[0]); //a,高版本浏览器兼容 alert(str.charAt(0)); //a,兼容所 ...

  8. Codeforces 1154F Shovels Shop

    题目链接:http://codeforces.com/problemset/problem/1154/F 题目大意: 商店有n把铲子,欲购k把,现有m种优惠,每种优惠可使用多次,每种优惠(x, y)表 ...

  9. scala下划线

    作为函数的参数 一个匿名的函数传递给一个方法或者函数的时候,scala会尽量推断出参数类型.例如一个完整的匿名函数作为参数可以写为 scala> def compute(f: (Double)= ...

  10. 新版本macos无法安装mysql-python包

    在更新了macos之后就发现无法正确安装python-mysql包了. 上网查阅了一下应该是c库或者osx的基础工具变动带来的问题.看到很多解决办法说使用pymysql,拜托我问的是如何安装pytho ...