HDU - 3068

最长回文
Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u

Submit Status

Description

给出一个只由小写英文字符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

Source

2009 Multi-University Training Contest 16 - Host by NIT

题目要求求出最长回文子串,是一道manacher的模板题。

我们先讲一下manacher,我们先处理一下字符串,把字符串处理成#a#a#这样的格式,比如abcd处理成#a#b#c#d#,这样的好处是解决了判断回文串是奇数和偶数的问题,把回文串强制变成奇数。接下来,定义一个p[]数组,p[i]代表以节点i为中心的最长回文串的半径。例如aaaa这个字符串,p[0]=p[3]=1,p[1]=p[2]=2。同时我们定义一个变量mx和id,mx代表当前判断过的回文子串最长延伸(往右)到哪里,可以理解为当前判断过的回文子串到达的最大下标。而id代表当前更新的mx值所对应的回文串的中心的下标。如果不是很清楚可以直接看下代码。剩下部分直接看代码注释吧。最好自己在纸上画一下

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define X first
#define Y second
#define clr(u,v); memset(u,v,sizeof(u));
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=2e5+10;//注意开两倍大小
const int INF=0x3f3f3f3f;
char s[maxn],str[maxn];//s为原字符串,str为处理后的字符串
int p[maxn];//p[i]代表以i为中心的回文串的最长半径
int len1,len2;//分别代表s的长度和str的长度
void init()//预处理出str
{len1=strlen(s);str[0]='$';//在首位加一个特殊字符,防止越界str[1]='#';for (int i=0;i<len1;i++){str[2*i+2]=s[i];str[2*i+3]='#';}len2=len1*2+2;str[len2]='\0';//不能和首位字符一样
}
void manacher()
{int mx=0,id=0;for (int i=1;i<len2;i++){if (mx>i) //如果当前的i在mx以内,说明i为我们之前求的回文串的范围里面     p[i]=min(p[2*id-i],mx-i);//2*id-i代表i关于id对称的下标,我们前面求出他是回文串,因此具备了对称性,而2*id-i一定小于i,我们的i是从左到右扫描的,所以p[2*id-i]一定处理出来了,所以我们可以直接用p[2*id-i]的值,但是他不能超过mx-i,因为超过mx值我们就不能保证它是回文串,所以取二者最小else p[i]=1;//如果i不在回文串的范围内,则初始化p[i]=1;for (;str[i-p[i]]==str[i+p[i]];p[i]++);//暴力往两边匹配,找到以i为中心的最长回文串if (mx<i+p[i])更新mx值和id值{mx=i+p[i];id=i;}}
}
int solve()
{int ans=0;for (int i=1;i<len2;i++)if (ans<p[i]) ans=p[i];//找最大的p[i]就是答案return ans-1;
}
int main()
{while (~scanf("%s",s)){init();manacher();printf("%d\n",solve());}return 0;
}

转载于:https://www.cnblogs.com/scaugsh/p/5964508.html

HDU - 3068 最长回文(manacher)相关推荐

  1. HDU 3068 最长回文 manacher算法

    Manacher算法的裸题 下面简单说一下复杂度为O(n)的马拉车算法  首先过程中涉及到的变量有:  p[i]表示以t[i]字符为中心的回文子串的半径  id为最大回文子串中心的位置  mx是回文串 ...

  2. hdu 3068 最长回文 (Manacher算法求最长回文串)

    参考博客:Manacher算法--O(n)回文子串算法 - xuanflyer - 博客频道 - CSDN.NET 从队友那里听来的一个算法,O(N)求得每个中心延伸的回文长度.这个算法好像比较偏门, ...

  3. hdu 3068 最长回文(manacher算法)

    最长回文                                                                         Time Limit: 4000/2000 M ...

  4. hdu 3068 最长回文【manacher】(模板题)

    <题目链接> 最长回文 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如a ...

  5. hdu 3068 最长回文(manacheramp;最长回文子串)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. HDU 3068 最长回文

    最长回文串模板题 Manacher 算法 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> ...

  7. HDU 3068 最长回文

    Manacher算法练笔,O(n)求最长回文子串. 参考资料:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824 http://www. ...

  8. 杭电3068 最长回文 最长回文的manacher算法

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. 最长回文Manacher

    预处理: 判断一个串是不是回文串,往往要分开编写,造成代码的拖沓 int LongestPalindrome(const char * s, int n){ int i, j, max; if (s ...

最新文章

  1. OpenCV 3最新模块介绍
  2. 航空航天大事件c语言程序设计,2017年沈阳航空航天大学航空航天工程学部823C语言程序设计考研强化模拟题...
  3. stack与queue
  4. 实验8.2 指针与字符串 7-2 字符串排序
  5. 一个TextView使用不同的颜色
  6. php网站建设实训引言_网站建设实训报告
  7. 跟着8张思维导图学习javascript
  8. 重装64位WIN7之后再装KUBUNTU遇到的问题
  9. 为什么 Eureka 比 ZooKeeper 更适合做注册中心?
  10. matlab 画点标号,学习笔记(四)——MATLAB画图
  11. adb快速截图小脚本
  12. matlab 无刷电机,无刷直流电机MATLAB仿真模型
  13. CSDN钱包提现协议
  14. 不安装运行时运行 .NET 程序 - NativeAOT
  15. HTML+CSS简单的网页制作期末作业 关于我的家乡——四川文化网页介绍 DW大学生网页作业制作设计 Dreamweaver简单网页成品
  16. strcpy和strncpy的区别
  17. ICM20602六轴传感器-IIC通信模式
  18. Ubuntu整个系统迁移到其他盘办法
  19. 聊聊eureka的delta配置
  20. 概率统计及其应用第三章知识总结_2020考研数学概率论与数理统计:各章节考试重点分析...

热门文章

  1. js获取被点击的元素以及子元素
  2. 解决windows10 wireshark无法抓取发出去的包只能抓取接受数据包
  3. Spring Boot 2.x 新特性总结及迁移指南
  4. Spring 的@Bean 的用法
  5. Makefile:自动化变量 $@,$^,$<,$?
  6. UBUNTU下gedit编辑器出现中文乱码现象
  7. 【Python】青少年蓝桥杯_每日一题_6.27_输出符合要求的10个自然数
  8. 越不服务器显示异常什么原因,计算机异常问题都有哪些常见类型
  9. 引用参考文献_引用参考文献时应注意些什么
  10. php 发送微信请求失败的原因,微信小程序模拟正常 真机服务器请求出错