Hdu 5371 Hotaru's problem (manacher+枚举)
2024-08-23 12:26:38
题目链接:
题目描述:
给出一个字符串N,要求找出一条N的最长连续子串。这个子串要满足:1:可以平均分成三段,2:第一段和第三段相等,3:第一段和第二段回文。
解题思路:
其实通俗来讲就是求符合题意的最长回文串。先用manacher与处理一下字符串N,得出以n[i]与n[i+1]为中心的回文串长度半径记为p[i],然后循环枚举i作为第一段的终点,p[i]+i-1作为第二段的终点记做j。当p[i]>=(j-i+1)&&p[j]>=(j-i+1)时,这个枚举区间[i, j]才算合法,然后比较求出最大区间长度即可。
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = ;
int a[maxn*], p[maxn*], n; void manather ()
{ for (int i=n; i>; i--)
{
a[i* ] = a[i];
a[i*-] = -;
} n = n * + ;
a[] = -;
a[n] = -;
int x = ; for (int i=; i<n; i++)
{ if (p[x]+x > i)
p[i] = min (p[*x-i], p[x]-i+x);
else
p[i] = ; while (a[i-p[i]] == a[i+p[i]])
p[i] ++; if (x+p[x] < i+p[i])
x = i;
}
}
int main ()
{
int t, l = ;
scanf ("%d", &t); while (t --)
{
scanf ("%d", &n); for (int i=; i<=n; i++)
scanf ("%d", &a[i]); manather();
int ans = ; for (int i=; i<=n; i+=)
for (int j=i+p[i]-; j-i>ans; j-=)
if (p[j]>=j-i+ && ans < j-i)
{
ans = j - i;
break;
} printf ("Case #%d: %d\n", ++l, ans/*);
} return ;
}
最新文章
- linux查看进程启动时间
- IIS短文件名扫描工具
- 解决前端浏览器传JSON对像到服务端后全部变成string类型的方法
- [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】
- FileZilla客户端源码解析
- 聊聊 Scala 的伴生对象及其意义
- CentOS最基本的20个常用命令
- Linux系统多网卡环境下的路由配置
- 一个比较全面 的web项目实战学习
- ASIHTTPRequest学习笔记
- log4j2的xml的配置样例
- Android调用系统软键盘
- jfinal如何获取参数为数组的值
- shutil模块---文件,文件夹复制、删除、压缩等处理
- Java并发工具类(三):控制并发线程数的Semaphore
- DI容器Ninject在管理接口和实现、基类和派生类并实现依赖注入方面的实例
- Combinations leetcode java
- UTF8和UCS2
- WCF已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性
- 服务器上的 Git - 生成 SSH 公钥
热门文章
- 基于gulp编写的一个简单实用的前端开发环境
- asp.net core 集成JWT(二)token的强制失效,基于策略模式细化api权限
- hash_map与unordered_map区别
- 图解TCP/IP第五版 -- 文件夹
- [机房合作]—SqlHelper我们又约了
- 7.1 itertools--高效循环的创建函数
- 【Android开发-4】进入实践,最喜欢折腾的计算器
- 编程基础知识——Java JNI开发流程(2)
- Mongodb for PHP教程之数据操作
- LoadRunner系列之—-04 录制基于https协议的脚本