這麼簡單的算法現在才學......

https://segmentfault.com/a/1190000008484167?utm_source=tag-newest#articleHeader3

https://www.cnblogs.com/grandyang/p/4475985.html


1.在字符之間加入‘#’使得所有回文串的長度變成奇數,方便處理

2.p[i]數組記錄以 i 為回文中心最長回文的半徑,p[i]-1剛好就是這個串的長度

3.mr,id兩個變量,id為能延伸到最右端mr的回文子串的對稱軸,此時左端點為 mr*2-i,(這兩個變量和循環變量 i 無直接關系

4.核心代碼:

if (i < mr)
p[i] = min(p[2 * id - i], mr - i);
else p[i]=1;

引用其他博客的圖片:

如果 mr - i > p[i],那麼以 j 為中心的回文串包含在以 id 為中心的回文串里,又因為 i,j 對稱,這樣p[i]就肯定等於p[j]了

如果 mr-i <= p[i],那麼綠框內至少是一樣的,外面的不知道,所以先設成綠框長度,以後在更新

如果 mr<=i,那麼就沒辦法了,只能從1開始算

最後接一個while暴力處理沒處理好的情況,在更新一下id和mr

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=;
char s[maxn];
char ss[maxn*];
int p[maxn*];//以i为中心最长回文半径
int init(){
int len=strlen(s);
ss[]='$';ss[]='#';
int l=;
for(int i=;i<len;i++){
ss[l++]=s[i];
ss[l++]='#';
}
ss[l]='\0';
return l;//長度
}
int manacher()
{
int len=init();
int maxlen=-;//最長回文長度
int id,mr=;//以id為中心最長回文右邊界mr,
for(int i=;i<len;i++){
if(i<mr)
p[i]=min(p[*id-i],mr-i);
else p[i]=;
while(ss[i-p[i]] == ss[i+p[i]])//不需邊界判斷
p[i]++;
//每走一步i都比較一下,希望mr盡可能遠,更有機會執行i<mr的代碼提高效率
if(mr<i+p[i])
id=i,mr=i+p[i];
maxlen=max(maxlen,p[i]-);
}
return maxlen;
}
int main()
{
scanf("%s",s);
printf("%d",manacher());
}

[模板]manacher的更多相关文章

  1. 洛谷P3805 [模板]Manacher算法 [manacher]

    题目传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符 ...

  2. 模板 manacher算法

    题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符串S 输出格 ...

  3. 洛谷.3805.[模板]manacher算法

    题目链接 之前做很早了没写这篇,补上. 记录当前ex[]最大的回文中心id和最远延伸范围mx! 关于串的构造: 应该是 @ #A#B#C#B#A# $ ,而不是 @ A#B#C#B#A $ 比如 @a ...

  4. 字符串的模板 Manacher kmp ac自动机 后缀数组 后缀自动机

    为何scanf("%s", str)不需要&运算 经常忘掉的字符串知识点,最好不加&,不加&最标准,指针如果像scanf里一样加&是错的,大概是未定 ...

  5. [模板] Manacher(马拉车)算法

    用途 求回文子串 做法 先考虑回文子串以某字符为中心的情况,即长度为奇数 推着做,记rad[i]为以i位置为中心的最大半径(包含中点) 考虑怎么求rad[i].找之前的一个右端点最靠右的位置p,设它的 ...

  6. [模板] manacher(教程)

    还是不会马拉车啊.今天又学了一遍,在这里讲一下. 其实就是一个很妙的思路,就是设置一个辅助的数组len,记录每个点的最大对称长度,然后再存一个mx记录最大的对称子串的右端点.先开二倍数组,然后一点点扩 ...

  7. POJ 3974 Palindrome(最长回文子串)

    题目链接:http://poj.org/problem?id=3974 题意:求一给定字符串最长回文子串的长度 思路:直接套模板manacher算法 code: #include <cstdio ...

  8. 字符串匹配--manacher算法模板

    manacher算法主要是处理字符串中关于回文串的问题的,它可以在 O(n) 的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍长度的新串,在每两个字符之间加入一个特定的特殊 ...

  9. ural 1297 Palindrome(Manacher模板题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 求最长回文子串. http://acm.timus.ru/problem.aspx ...

随机推荐

  1. Python多线程模块

    引言 thread threading 1 Thread 11 下面使用threading模块实现与上面相同的功能 12 在创建新线程时还可以给Thread传递可调用类的对象这样使用类本身来保存信息 ...

  2. RabbitMQ的安装与客户端的简单实用

    本文主要内容是RabbitMQ的安装步骤[Windows系统与linux上的安装]及客户端的简单使用. 1.下载 下载地址:http://www.rabbitmq.com/download.html ...

  3. c++变量定义

    float **a 表示a是一个“指针的指针”,也可以理解为是一个二维数组的指针,***a具有类似的解释,可以理解为是一个三维数组的指针.

  4. Objective-C学习之解析XML

    通过soap请求webservice时,返回的数据是XML类型,有时候也需要解析本地的xml数据等,苹果自带类NSXMLParser解析xml还是很方便的,简单轻便 本文以解析本地XML为例,网络获取 ...

  5. 我在面试.NET/C#程序员时会提出的问题

    我在面试.NET/C#程序员时会提出的问题 2011-03-03 15:38 by 老赵, 28107 visits 说起来我也面试过相当数量的.NET(包括C#,后文不重复)程序员了,有的通过电话, ...

  6. Python模块:os

    OS模块常用用法: os.name() #判断当前使用的系统环境,windows则返回 ‘nt’,Linux则返回‘posix’ os.getcwd() #显示当前目录 os.listdir() #以 ...

  7. LSH-局部敏感哈希

    LSH的基本思想是: 将原始数据空间中的两个邻近数据点通过某种映射或变换,使得这两个数据点在变换后的数据空间中仍然相邻的概率很大,而不相邻的数据点被映射到同一个桶的概率很小. 因此,最最重要的就变成了 ...

  8. HDU1203(01背包变形)

    I NEED A OFFER! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   D ...

  9. 【225】ArcEngine 实现要素添加 & 删除

    参考:ArcGIS Engine效率探究——要素的添加和删除.属性的读取和更新 删除要素 //添加图层,显示在最上面 axMapControl1.AddShapeFile(@"D:\01-业 ...

  10. docker三剑客之一docker compose

    compose有两个重要的概念: 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker- ...