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 ;
}

最新文章

  1. vs2010 在64bits系统下编译
  2. 关于nginx的1W并发的优化
  3. 配置red hat的ip 自动地址
  4. Java中Runnable和Thread的区别(转)
  5. 【线段树/数学/扩展欧几里得】 Bzoj 3913:奇数国
  6. wcf中 生成x5.09证书的工具
  7. innodb系统表空间维护
  8. Windows 2008 R2_NLB网络负载均衡(图文详解)(转)
  9. SQL SERVER 2012 AlwaysOn– 数据库层面 02
  10. Java EE之表达式语言EL(上)
  11. 高校表白APP-冲刺第一天
  12. linux虚拟机桥接网络配置
  13. 【PyTorch深度学习60分钟快速入门 】Part2:Autograd自动化微分
  14. MySQL的lock tables和unlock tables的用法(转载)
  15. 利用rundll32执行程序的函数执行程序
  16. Linux与Windows比较出的20个优势
  17. Scrum Meeting Beta - 4
  18. OEM SLP Key
  19. Sqlite-SQLiteHelper类,操作SQLite数据库
  20. JavaScript class 使用

热门文章

  1. js正则替换十六进制
  2. 洛谷P2527 [SHOI2001]Panda的烦恼
  3. docker镜像没有ifconfig、ping指令
  4. Android: java.lang.ClassCastException: android.widget.imageView cannot be cast to android.widget.textView异常解决
  5. SpringBoot 配置 @PropertySource、@ImportResource、@Bean
  6. 金明的预算方案(codevs 1155)
  7. django学习之- Models笔记
  8. 扫描仪共享工具(BlindScanner Pro) 3.23 特别版
  9. java比较两个日期大小
  10. 一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)