最长回文 HDU - 3068(求最长回文串的长度【马拉车算法Manacher】)

马拉车算法 Manacher‘s Algorithm 是用来查找一个字符串的最长回文子串的线性方法,由一个叫
Manacher 的人在 1975 年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性
dp[i] = ma > i ? min(dp[2 * mod - i], ma - i) : 1;
可以这么说,这行要是理解了,那么马拉车算法基本上就没啥问题了,那么这一行代码拆开来看就是
如果 ma > i, 则 p[i] = min( dp[2 *mod - i] , ma - i )
否则,dp[i] = 1(本身)
【care一】ma>i
(1)当 ma - i >dP[j] 的时候,以S[j]为中心的回文子串包含在以 S[mod] 为中心的回文子串中,由于 i 和 j 对称,以 S[i] 为中心的
回文子串必然包含在以 S[mod] 为中心的回文子串中,所以必有 P[i] = P[j],其中 j = 2*id - i,因为 j 到 id 之间到距离等于
id 到 i 之间到距离,为 i - id,所以 j = id - (i - id) = 2*id - i,参见下图。ma的对称点    =2*mod-i(i关于mod的对称点)   (mod为能延伸到最右端的位置的那个回文子串的中心点位置)mi         j              mod             i           ma(记录向右边延伸最多的位置)
—————|—————————|———————————————|———————————————|—————————|——|————————|—————————————                  ———————|—————————||  dp[j]  |(以dp[j]表示以v[j]字符为中心的回文子串的半径)—————————————————————————————————————————————————————————————(2)当 dP[j] >= ma - i 的时候,以 S[j] 为中心的回文子串不一定完全包含于以 S[mod] 为中心的回文子串中,但是基于对称性可知,
下图中两个绿框所包围的部分是相同的,也就是说以 S[i] 为中心的回文子串,其向右至少会扩张到 ma的位置,也就是说 dP[i] = ma - i。
至于 ma 之后的部分是否对称,就只能老老实实去匹配了,这就是后面紧跟到 while 循环的作用。ma的对称点    =2*mod-i(i关于mod的对称点)   (mod为能延伸到最右端的位置的那个回文子串的中心点位置)mi         j              mod             i           ma(记录向右边延伸最多的位置)
—————|—————————|———————————————|———————————————|———————————|————————||——————————|—————————|         |——————————|———————————|——||     dp[j] |  |(以dp[j]表示以v[j]字符为中心的回文子串的半径)|—————————————————————————————————————————————————————|【care二】
对于 ma <= i 的情况,无法对 P[i] 做更多的假设,只能 P[i] = 1,然后再去匹配了。

题目:

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 
回文就是正反读都是一样的字符串,如aba, abba等

Input

输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S 
两组case之间由空行隔开(该空行不用处理) 
字符串长度len <= 110000

Output

每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度. 

Sample Input

aaaaabab

Sample Output

4
3

AC代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int M=110010;
int dp[M*2];//dp[i]表示以v[i]字符为中心的回文子串的半径
char u[M],s[M*2];
int ans,len;
void manacher()
{/**马拉车算法的第一步是预处理,做法是在每一个字符的左右都加上一个特殊字符,比如加上 '#',这样做的好处是不论原字符串是奇数还是偶数个,处理之后得到的字符串的个数都是奇数个*/int l=0;s[l++]='$'; //s[0]='*',s[len*2+2]='\0',防止在while时dp[i]越界s[l++]='#';//Manacher处理回文串时,需要在每个字符串的中间以及两端插入不会出现的字符,然后再枚举for(int i=0; i<len; i++) //插入了len+1个'#',最终的s长度是1~(len+len+1)即2*len+1,首尾s[0]和s[2*len+2]要插入不同的字符{s[l++]=u[i];s[l++]='#';}s[l]='\0';int ma=0,mod=0;///ma记录向右边延伸最多的位置,for(int i=0; i<l; i++){dp[i]=ma>i?min(dp[mod*2-i],ma-i):1;/**i为我们设定的回文串中心,若>ma,则此时没有回文串被包含,只能慢慢枚举,其他详细分析,见上*/while(s[dp[i]+i]==s[i-dp[i]]) dp[i]++;if(i+dp[i]>ma){ma=i+dp[i];mod=i;}}
}
int main()
{while(~scanf("%s",u)){len=strlen(u);manacher();ans=-1;for(int i=0; i<2*len+2; i++)ans=max(ans,dp[i]-1);printf("%d\n",ans);}return 0;
}

 

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

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

相关文章

java中的循环结构_Java中的循环结构进阶

循环结构进阶学习本章用到的单词triangle:三角形circle:圆形diamond:钻石password:密码row:行.排列二重循环结构简单的说:二重循环就是一个循环体内又包含另一个完整的循环结构.while循环结构,do-while循环结构,for循环结构三种循环结是可以相互嵌套的语法://while与while循环嵌…

.NET Core + Kubernetes:Deployment

在上篇文章 .NET Core Kubernetes&#xff1a;Pod 中&#xff0c;主要介绍了 Pod 的相关内容&#xff0c; 基于 Pod 为单位能更加合理进行容器编排&#xff0c;然而 Pod 只是个启动了一个或一组容器的资源类型&#xff0c;在实际应用中&#xff0c;我们也需要 Pod 能实现动态扩…

java dos平台压缩_Dos命令 压缩 解压缩

你的机器 有RAR吗> 装个rar里面有个Rar.exe文件用法: rar - - a 添加文件到压缩文件c 添加压缩文件注释cf 添加文件注释cw 写入压缩文件注释…

Oulipo HDU - 1686(哈希或KMP)匹配字符串

题意&#xff1a;字符串匹配&#xff1a;寻找字符串S中&#xff0c;字符串T出现的次数 思路&#xff1a;KMP或哈希 The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter e. He was a member of the Oulipo group. A quote …

我整理了100G的.Net学习资料,速来领取!

听说免费送课会上瘾&#xff1f;不分享点干货给大家学习&#xff0c;完全无法衬托本号主的好人特质啊&#xff01;正所谓白嫖一时爽&#xff0c;一直白嫖一直爽&#xff01;举起你滴双手&#xff0c;擦亮你的眼睛&#xff01;今天我要丢个硬核干货&#xff01;一次性怒砸几百个…

maven mysql的jdbctemplate_JDBC、JDBCTemplate、MyBatis、Hiberante 比较与分析

JDBC (Java Data Base Connection,java数据库连接)JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发…

[C++STL]list容器用法介绍

代码如下: #include <iostream> #include <string> #include <list> using namespace std;void printList(const list<int>&L) {for (list<int>::const_iterator it L.begin(); it ! L.end(); it){cout << *it << " &quo…

C#黔驴技巧之去重(Distinct)

关于C#中默认的Distinct方法在什么情况下才能去重&#xff0c;这个就不用我再多讲&#xff0c;针对集合对象去重默认实现将不再满足&#xff0c;于是乎我们需要自定义实现来解决这个问题&#xff0c;接下来我们详细讲解几种常见去重方案&#xff0c;孰好孰歹自行判之。分组首先…

Almost Union-Find UVA - 11987(并查集的删除操作)

题意&#xff1a;求出每个集合的元素个数&#xff0c;及总和&#xff0c;给出三个操作&#xff1a; 1 将含有a元素和b元素的集合合并&#xff1b;2 将a元素放入含有b元素的集合中&#xff1b;3 输出a元素所在集合的元素个数及总和&#xff1b; 思路&#xff1a;正常并查集&am…

java.sql 拒绝连接_hive jdbc 拒绝连接问题

本帖最后由 willgone 于 2017-06-21 10:56 编辑平台配置在附件中。private static String driverName1 "org.apache.hive.jdbc.HiveDriver";Class.forName(driverName1);String url"jdbc:hive2://192.168.160.241:21076/default";Connection con DriverM…

ASP.NET Core分布式项目实战(oauth2 + oidc 实现 server部分)--学习笔记

任务15&#xff1a;oauth2 oidc 实现 server部分基于之前快速入门的项目&#xff08;MvcCookieAuthSample&#xff09;&#xff1a;ASP.NET Core快速入门&#xff08;第5章&#xff1a;认证与授权&#xff09;--学习笔记ASP.NET Core快速入门&#xff08;第6章&#xff1a;ASP…

[C++STL]set容器用法介绍

代码如下: #include <iostream> #include <set> using namespace std;void printSet(set<int>&s) {for (set<int>::iterator it s.begin(); it ! s.end(); it){cout << *it << " ";}cout << endl; }void test01() {…

Equations HDU - 1496(哈希或三层for循环)求满足公式有多少种情况

题意:求x在(-100<x<100)区间上&#xff0c;已知a,b,c,d&#xff0c;满足a*x1^2b*x2^2c*x3^2d*x4^20 的情况有多少种 思路&#xff1a;很明显四层for循环肯定超时&#xff0c;可用三层for循环来判断&#xff0c;或是&#xff0c;两两组合&#xff0c;求多少种情况。分正负…

java.time.format例子_java格式化时间示例

实现日期的格式化&#xff0c;需要用到类: java.text.DateFormatDateFormat没有可以直接使用的构造函数&#xff0c;一般使用DateFormate的子类---java.text.SimpleDateFormat完成构造.public SimpleDateFormat(String pattern)测试代码import java.text.DateFormat;import jav…

[C++STL]map容器用法介绍

代码如下: #include <iostream> #include <string> #include <map> using namespace std;void printMap(map<int,int>&m) {for (map<int, int>::iterator it m.begin(); it ! m.end(); it){cout << "key " << it-&…

ABP框架 v2.7.0已经发布!

ABP框架和ABP商业版 v2.7已经发布.我们没有为2.4,2.5和2.6发布博客文章,所以这篇文章也将涵盖这几个版本中新增内容和过去的2个月里我们完成了什么.关于发布周期与开发之前说过我们已经开始每两个星期发布一个新的次要功能版本,一般在星期四.我们的目标是尽快提供新功能.在过去…

Colossal Fibonacci Numbers! UVA - 11582(斐波那契求模)+快速幂+周期规律

题意&#xff1a; 给出64位整数a、b以及不超过1000的正整数n&#xff0c;求斐波那契数列第a ^ b项模n的结果。 输入&#xff1a;情况数T&#xff0c;之后T行每行a、b、n。 输出&#xff1a;斐波那契数列第a ^ b项模n的结果。 分析&#xff1a;由于斐波那契数列的每一项都是由…

java中factory方法_Java的23中设计模式--工厂方法模式(Factory Method)

1.普通工厂模式工厂类/*** Title Factory.java* Package factory.factory1* date 2015-1-22 上午10:16:02*versionV1.0*/packagefactory.factory1;/*** ClassName Factory* date 2015-1-22 上午10:16:02*/public classFactory {publicSender procedure(String type) {if("…