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

  

 

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

 

思路:先Manacher求最长子串,利用期间所记录的P 数组,穷举一下所有可能的前两串,再用O(1)时间判断第3串是否符合要求。

  具体做法:

  (1)P[i]记录的是以i为中心,从i-P[i]+1到i+P[i]-1这段都是回文。由于前两段之和必为偶数,所以必须选取str[i]为'#'的。

  (2)扫一遍每个'#',以其最长的回文开始穷举(仅需将P[i]--即可,然后找到右边对应的'#',判断P[i]是不是大于所穷举的长度),直到3段都满足要求了,跳出此‘#’,换下一个。

  

 

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <vector>
 4 #include <stdio.h>
 5 using namespace std;
 6 const int N=100010;
 7 int n;
 8 int s[N*2];
 9 int P[N*2];
10 
11 
12 int cal(int len)
13 {
14     if(n<3) return 0;
15     memset(P,0,sizeof(P));
16     int id=1, mx=1;
17     P[0]=1;
18     P[1]=1;
19     for(int i=2; i<len; i++)
20     {
21         P[i] =i>mx? 1: min( P[2*id-i], mx-i);
22         while(s[i+P[i]]==s[i-P[i]])    P[i]++;
23         if(i+P[i]>mx)
24         {
25             id=i;
26             mx=i+P[i];
27         }
28     }
29     int ans=0;
30     for(int i=3; i+4<len; i+=2)
31     {
32         int tag=P[i]-1;
33         if( tag>1 && tag>ans )
34         {
35             while( P[i+tag]<=tag && tag>ans )    tag--;
36             if(tag>ans) ans=tag;
37         }
38     }
39 
40     return ans/2*3;
41 }
42 
43 int main()
44 {
45     //freopen("input.txt", "r", stdin);
46     int t, tmp, j=0;
47     cin>>t;
48 
49     while(t--)
50     {
51         scanf("%d", &n);
52         s[0]=-1;
53         s[1]=-2;
54         for(int i=0,j=2; i<n; i++)
55         {
56             scanf("%d",&tmp);
57             s[j++]=tmp;
58             s[j++]=-2;
59         }
60         s[n*2+2]=-30;
61 
62         printf("Case #%d: %d\n", ++j, cal( n*2+2 ));
63     }
64     return 0;
65 }
AC代码

 

转载于:https://www.cnblogs.com/xcw0754/p/4722537.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bash 与 dash

Ubuntu 的 bash和dash的区别 什么是bash &#xff1f; Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell&#xff0c;事实上&#xff0c;还有许多传统UNIX上用的Shell&#xff0c;像tcsh、csh、ash、bsh、ksh等 等&#xff0c;Shell Script大致都类同&#xff0c;当您学…

350. 两个数组的交集 II

给你两个整数数组 nums1 和 nums2 &#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值&#xff09;。可以不考虑输出结果的顺序。 来源&a…

Eclipse:如何附加Java源代码

在Eclipse中&#xff0c;当您按Ctrl按钮并单击任何类名称时&#xff0c;IDE会将您带到该类的源文件。 这是项目中具有的类的正常行为。 但是&#xff0c;如果您也希望Java核心类具有相同的行为&#xff0c;则可以通过将Java源代码附加到Eclipse IDE来实现。 一旦附加了源代码&a…

【树状数组】

问题的提出&#xff1a;是否可以用线性数据结构的方法解决动态统计子树权和的问题呢&#xff1f; 有的&#xff0c;树状数组。 假设当前数组为a[]&#xff0c;元素个数为n。 1. 子区间的权和数组为sum&#xff0c;那么数组a[]中 i 到 j这段区间的数组元素和为sum[i,j] a[k]的累…

2013VS快捷键

VS2013常用快捷键&#xff1a; 1.回到上一个光标位置/前进到下一个光标位置 1&#xff09;回到上一个光标位置&#xff1a;使用组合键“Ctrl -”&#xff1b; 2&#xff09;前进到下一个光标位置&#xff1a;“Ctrl Shift - ”。 2.复制/剪切/删除整行代码 1&#xff09;如果…

GWT,GWT-Ext(SmartGWT),GXT(Ext GWT)常见任务

我在我们的JCG合作伙伴之一UI-Programming博客上浏览了一些旧文章&#xff0c;并注意到有很多简短的文章&#xff0c;介绍了如何使用GWT&#xff0c;GWT-Ext&#xff08;SmartGWT&#xff09;和GXT&#xff08;Ext GWT&#xff09;执行一些常见任务。 &#xff09;。 我相信它们…

h.264 去块滤波

块效应及其产生原因 我们在观看视频的时候&#xff0c;在运动剧烈的场景常能观察到图像出现小方块&#xff0c;小方块在边界处呈现不连续的效果&#xff08;如下图&#xff09;&#xff0c;这种现象被称为块效应&#xff08;blocking artifact&#xff09;。 首先我们需要搞清楚…

android开发的知识点(一)

1.android中背景图的设置&#xff1a; 将背景图放入到项目中的res/drawable-hdpi或res/drawable-mdpi或res/drawable-xhdpi或res/drawable-xxhdpi等任一文件夹下。然后在layout的xml文件夹下使用android:background"drawable/背景图名"&#xff0c;其中背景图必须是p…

566. 重塑矩阵

在 MATLAB 中&#xff0c;有一个非常有用的函数 reshape &#xff0c;它可以将一个 m x n 矩阵重塑为另一个大小不同&#xff08;r x c&#xff09;的新矩阵&#xff0c;但保留其原始数据。 给你一个由二维数组 mat 表示的 m x n 矩阵&#xff0c;以及两个正整数 r 和 c &…

RabbitMQ播放模块! 构架

RabbitMQ提供了具有可预测且一致的吞吐量和延迟的高可用性&#xff0c;可伸缩和便携式消息系统。 RabbitMQ是AMQP &#xff08;业务消息传递的开放标准&#xff09;的领先实现 &#xff0c;并且通过适配器支持XMPP&#xff0c;SMTP&#xff0c;STOMP和HTTP来进行轻量级Web消息传…

Cyclic Nacklace - HDU 3746(next求循环节)

题目大意&#xff1a;给你一些串&#xff0c;问如果想让这个串里面的循环节至少循环两次&#xff0c;需要添加几个字符&#xff08;只能在最前面或者最后面添加&#xff09;。比如ababc 需要添加5个就是添加ababc。 分析&#xff1a;其实字符串的长度len-next[len] 最小循环节…

Xuggler开发教程

大家好&#xff0c; 在这篇文章中&#xff0c;我想介绍JavaCodeGeeks上的一些很酷的新教程。 他们将讨论与Xuggler &#xff0c; FFmpeg和Wowza进行媒体&#xff08;音频/视频&#xff09;操纵的方式。 我将在这篇文章中跟踪所有相关的教程。 您可以通过查看Pat较早的关于使用…

739. 每日温度

请根据每日 气温 列表 temperatures &#xff0c;请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 代码一 单调栈 class Solution {public int[] dailyTemperatures(int[] temperatures) {int length temperatur…

一个非常好的性格切割问题

结伙stackoverflow看到一道非常不错的问题。遂拿来分享之。 题目要求&#xff1a;我有一个非常长的字符串&#xff1a; String s1"This is my world. This has to be broken." 我要把上面的字符串打乱以固定的长度&#xff08;比如10&#xff09;使得输出为&#xff…

Cajo,用Java完成分布式计算的最简单方法

摘自Jonas Boner在2006年5月1日发布在TheServerSide.com上的文章“ Distributed Computing Easy”中的介绍部分&#xff1a; 分布式计算在企业应用程序开发世界中变得越来越重要。 如今&#xff0c;开发人员不断需要解决以下问题&#xff1a;如何通过将应用程序扩展到单个节点之…

Java中Integer.parseInt()用法

1.先看看该方法的实现 public static int parseInt(String s) throws NumberFormatException {return parseInt(s,10);}2.事实上他可以有两个参数&#xff0c; public static int parseInt(String s,int radix)意味着将字符串s按照radix进制转换成整数。太抽象了&#xff0c;…

关于maven相互依赖的工程部署问题

环境&#xff1a;win7 64位&#xff0c;myeclipse10.6&#xff0c;eclipse4.5&#xff0c;都配置了svn插件 问题描述&#xff1a;1、工程模块化之后都是通过pom配置model来关联的&#xff0c;svn提交之后&#xff0c;通过myeclipse的svn‘检出为项目’&#xff0c;依赖的子工程…

什么是JAR包?

jar包就是别人已经写好的一些类&#xff0c;然后将这些类进行打包&#xff0c;你可以将这些jar包引入你的项目中&#xff0c;然后就可以直接使用这些jar包中的类和属性了&#xff0c;这些jar包一般都会放在lib目录下的 转载于:https://www.cnblogs.com/wulianshang/p/5513474.h…

....

输入流和输出流相对于内存设备而言. 将外设中的数据读取到内存中:输入将内存的数写入到外设中&#xff1a;输出。 字符流的由来&#xff1a;其实就是&#xff1a;字节流读取文字字节数据后&#xff0c;不直接操作而是先查指定的编码表。获取对应的文字。在对这个文字进行操作。…

DataNucleus 3.0与Hibernate 3.5

如官方产品站点所述&#xff0c; DataNucleus Access Platform是现有的最符合标准的开源Java持久性产品。 它完全符合JDO1 &#xff0c; JDO2 &#xff0c; JDO2.1 &#xff0c; JDO2.2 &#xff0c; JDO3 &#xff0c; JPA1和JPA2 Java标准。 它还符合OGC简单功能规范&#xf…