HDU - 4513 吉哥系列故事――完美队形II(manacher)
2024-09-04 05:27:04
1、找出一个最长的回文子串,要求中间的值最大,然后向两侧递减。
2、判断条件改为:Ma[i+Mp[i]]==Ma[i-Mp[i]]&&Ma[i-Mp[i]]<=Ma[i-Mp[i]+2]
3、
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std; //求最长回文子串
const int MAXN=;
int Ma[MAXN*];
int Mp[MAXN*]; 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]=;//标志'\0'
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]]&&Ma[i-Mp[i]]<=Ma[i-Mp[i]+])Mp[i]++;
if(i+Mp[i]>mx){
mx=i+Mp[i];
id=i;
}
}
}
/*
abaaba
i: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
Ma[i]:$ # a # b # a # a # b # a #
Mp[i]:1 1 2 1 4 1 2 7 2 1 4 1 2 1
*/ int s[MAXN];
int main(){
int T,n,i;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(i=;i<n;++i)
scanf("%d",&s[i]);
Manacher(s,n);
int ans=;
for(i=;i<*n+;++i)
ans=max(ans,Mp[i]-);
printf("%d\n",ans);
}
return ;
}
最新文章
- vs2010 在64bits系统下编译
- 关于nginx的1W并发的优化
- 配置red hat的ip 自动地址
- Java中Runnable和Thread的区别(转)
- 【线段树/数学/扩展欧几里得】 Bzoj 3913:奇数国
- wcf中 生成x5.09证书的工具
- innodb系统表空间维护
- Windows 2008 R2_NLB网络负载均衡(图文详解)(转)
- SQL SERVER 2012 AlwaysOn– 数据库层面 02
- Java EE之表达式语言EL(上)
- 高校表白APP-冲刺第一天
- linux虚拟机桥接网络配置
- 【PyTorch深度学习60分钟快速入门 】Part2:Autograd自动化微分
- MySQL的lock tables和unlock tables的用法(转载)
- 利用rundll32执行程序的函数执行程序
- Linux与Windows比较出的20个优势
- Scrum Meeting Beta - 4
- OEM SLP Key
- Sqlite-SQLiteHelper类,操作SQLite数据库
- JavaScript class 使用
热门文章
- js正则替换十六进制
- 洛谷P2527 [SHOI2001]Panda的烦恼
- docker镜像没有ifconfig、ping指令
- Android: java.lang.ClassCastException: android.widget.imageView cannot be cast to android.widget.textView异常解决
- SpringBoot 配置 @PropertySource、@ImportResource、@Bean
- 金明的预算方案(codevs 1155)
- django学习之- Models笔记
- 扫描仪共享工具(BlindScanner Pro) 3.23 特别版
- java比较两个日期大小
- 一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)