题目链接:

  Hdu 5371 Hotaru's problem

题目描述:

  给出一个字符串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 ;
}

最新文章

  1. linux查看进程启动时间
  2. IIS短文件名扫描工具
  3. 解决前端浏览器传JSON对像到服务端后全部变成string类型的方法
  4. [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】
  5. FileZilla客户端源码解析
  6. 聊聊 Scala 的伴生对象及其意义
  7. CentOS最基本的20个常用命令
  8. Linux系统多网卡环境下的路由配置
  9. 一个比较全面 的web项目实战学习
  10. ASIHTTPRequest学习笔记
  11. log4j2的xml的配置样例
  12. Android调用系统软键盘
  13. jfinal如何获取参数为数组的值
  14. shutil模块---文件,文件夹复制、删除、压缩等处理
  15. Java并发工具类(三):控制并发线程数的Semaphore
  16. DI容器Ninject在管理接口和实现、基类和派生类并实现依赖注入方面的实例
  17. Combinations leetcode java
  18. UTF8和UCS2
  19. WCF已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性
  20. 服务器上的 Git - 生成 SSH 公钥

热门文章

  1. 基于gulp编写的一个简单实用的前端开发环境
  2. asp.net core 集成JWT(二)token的强制失效,基于策略模式细化api权限
  3. hash_map与unordered_map区别
  4. 图解TCP/IP第五版 -- 文件夹
  5. [机房合作]—SqlHelper我们又约了
  6. 7.1 itertools--高效循环的创建函数
  7. 【Android开发-4】进入实践,最喜欢折腾的计算器
  8. 编程基础知识——Java JNI开发流程(2)
  9. Mongodb for PHP教程之数据操作
  10. LoadRunner系列之—-04 录制基于https协议的脚本