题目描述

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

aaaa
abab

Sample Output

4
3
题解:求最长的回文子串,肯定是要用到Manacher算法,Manacher算法可自行在哔哩哔哩上搜到相关的视频讲解,我就不多说了,不得不说,这个算法是真的好 orz,时间复杂度为O(n)。
代码如下:

#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
const int N = 2e6 + 10;
char s[N], Mp[N];
int Ma[N], l, len;
void Manacher()
{//首先我们先进行填充,填充的目的是:让奇数和偶数的回文串都能通过一个方法求出,不用分别考虑了。//大大节省了复杂度。l = 0;Mp[l++] = '$';Mp[l++] = '#';for(int i = 0; i < len; i++){Mp[l++] = s[i];Mp[l++] = '#';}Mp[l] = 0;int id = 0, mx = 0;  //mx表示1~i - 1回文串中能够达到的右边界的最大值//id表示上述回文串的对称轴的位置for(int i = 0; i < l; i++){Ma[i] = mx > i ? min(mx - i, Ma[2 * id - i]) : 1; //快速求出Ma[i]的优化方法。while(Mp[i - Ma[i]] == Mp[i + Ma[i]])Ma[i]++;if(i + Ma[i] > mx){   //记录1 ~ i - 1 回文串中能够达到的右边界的最大值mx = i + Ma[i];id = i;}}
}
int main()
{int k = 1;while(scanf("%s", s) != EOF){if(strcmp(s, "END") == 0)break;len = strlen(s);Manacher();int ans = 0;for(int i = 0; i < l; i++)  //找出最大的回文即可ans = max(ans, Ma[i]);printf("Case %d: ", k++);printf("%d\n", ans - 1);}return 0;
}

最长回文(Manacher算法模板)相关推荐

  1. HDU 3068 最长回文 manacher算法

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

  2. HDU-3068-最长回文 (Manacher算法)

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

  3. C++longest palindromic subsequence最长回文子序列算法实现(附完整源码)

    C++longest palindromic subsequence最长回文子序列算法 C++longest palindromic subsequence最长回文子序列算法实现完整源码(定义,实现, ...

  4. JAVA:实现LongestPalindromicSubsequence最长回文子序列算法(附完整源码)

    JAVA:实现LongestPalindromicSubsequence最长回文子序列算法 package com.thealgorithms.dynamicprogramming; public c ...

  5. Manacher 求最长回文子串算法

    Manacher算法,是由一个叫Manacher的人在1975年发明的,可以在$O(n)$的时间复杂度里求出一个字符串中的最长回文子串. 例如这两个回文串"level"." ...

  6. Manacher's algorithm: 最长回文子串算法

    Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...

  7. 最长回文Manacher

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

  8. python求最大回文数_python最长回文串算法

    给定一个字符串,要求在这个字符串中找到符合回文性质的最长子串.所谓回文性是指诸如 "aba","ababa","abba"这类的字符串,当然 ...

  9. C语言实现:最长回文子串算法

    1.问题描述: 给定一个字符串,求它的最长回文子串的长度. 回文定义:字符串的逆序和其本身一致.(例如:abcba) 2.两种解法: 2.1.中心扩散法: 思路: 验证回文是从字符串两端开始对比,算法 ...

最新文章

  1. Google最新论文:Youtube视频推荐如何做多目标排序
  2. idea没有错误出现红色波浪线怎么去掉?
  3. c++ 调用system 不显示黑框_Java回调的四种写法:反射+直接调用+接口调用+Lambda表达式...
  4. C++语言基础(1)-命名空间
  5. leetcode226. 翻转二叉树(dfs)
  6. nginx日志定期归档脚本
  7. 无碳小车 matlab,基于无碳小车前轮运动关系的MATLAB运动轨迹仿真.doc
  8. embedding.assign(embedding_input)的解读
  9. Swift实践:使用CoreData存储多种数据类的通讯录
  10. 删除none 的images报错 image has dependent child images 解决办法
  11. 55寸0.88mm拼接屏对比1.8mm拼接显示效果
  12. 如何在浏览器播放amr格式的音频文件
  13. 打开计算机窗口的控制菜单,打开控制面板的几种方法
  14. Dubbo支持自适应等待无损下线
  15. Word表格斜线怎么弄?这里有三种方法很实用
  16. java validate 框架_使用validate验证框架
  17. 在自己的app中打开淘宝
  18. Adam学习25之读取sam生成的alignmentRecord含recordGroupDictionary
  19. C++ 如何保留两位小数
  20. Python——函数的嵌套

热门文章

  1. 自定义Excel导出简易组件
  2. LeetCode_Rotate List
  3. ODP.NET开发和部署的相关问题
  4. 说一下php的自动加载,php的_autoload函数实现自动加载类的使用
  5. mysql使用文件排序_Mysql排序FileSort的问题
  6. supervivi的一点秘密
  7. 删除Ubuntu旧内核的几种方法,这下grub菜单看起来清爽多了!
  8. WMPLib.WindowsMediaPlayer 的用法
  9. 【计算机网络】Internet原理与技术2(因特网的路由协议RIP、OSPF、BGP,网络地址转换NAT,网络协议IPv6)
  10. Linux运维问题解决(3)——VMware启动虚拟机报错 : 该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按“获取(T)