【模板】Manacher 回文串】的更多相关文章

O(n)的复杂度求回文串:Manacher算法 定义一个回文值,字符串S是K重回文串,当且仅当S是回文串,且其长度为⌊N/2⌋的前缀和长度为⌊N/2⌋的后缀是K−1重回文串 现在给一个2*10^6长度的字符串,求其每个前缀的最大回文值之和. 设dp[i]为长度为i的前缀的最大回文值. 当长度为i的前缀的字符串是回文串的时候,有:dp[i]=dp[i/2]+1 若不是回文串 dp[i]=0 接下来就是怎么样快速的判断回文串了,推荐算法Manacher算法. Manacher算法先对字符串进行修改…
Ball Blasting Game Morteza is playing a ball blasting game. In this game there is a chain of different colored balls. He is expected to explode as many balls as possible by aligning same-colored balls and making a sequence of them. To align balls, he…
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等   Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S两组case之间由空行隔开(该空行不用处理)字符串长度len <= 110000   Output…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题意就是给你一个串s 然后求把s分成两部分之后的价值总和是多少,分开的串 如果是回文那么价值就是每个字母的价值之和,如果不是那么价值就是0: 例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 abbadf 那么可以分成abba 和df abba的价值是1+2+2+1=6,df不是回文串所以价值为0:…
FROM:  http://hi.baidu.com/chenwenwen0210/item/482c84396476f0e02f8ec230 #include<stdio.h> #include<math.h> #include<string.h> #include<map> #include<algorithm> #include<queue> using namespace std; typedef __int64 lld;  …
推荐两个讲得很好的博客: http://blog.sina.com.cn/s/blog_70811e1a01014esn.html https://segmentfault.com/a/1190000003914228 #include<cstring> #include<cstdio> #include<algorithm> #define N (22000010) using namespace std; int n, ans, mid, mx; int p[N];…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意很清楚:就是求一个串s的子串中最长回文串的长度:这类题用到了manacher算法 #include<stdio.h> #include<string.h> #include<algorithm> #include<stdlib.h> using namespace std; ; char s[N]; int p[N]; ///定义数组p[i]表示以i为…
转自:https://segmentfault.com/a/1190000008484167 /* 由于回文分为偶回文(比如 bccb)和奇回文(比如 bcacb),而在处理奇偶问题上会比较繁琐,所以这里我们使用一个技巧,在字符间插入一个字符(前提这个字符未出现在串里).举个例子:s="abbahopxpo",转换为s_new="$#a#b#b#a#h#o#p#x#p#o#"(这里的字符 &dollar; 只是为了防止越界,下面代码会有说明),如此,s 里起…
用途:在O(n)时间内,求出以每一个点为中心的回文串长度. 首先,有一个非常巧妙的转化.由于回文串长度有可能为奇数也有可能为偶数,说明回文中心不一定在一个字符上.所以要将字符串做如下处理:在每两个字母之间插入一个特殊字符,通常用"#",这样所有的回文串就都变成了以一个字符为回文中心的.并且,我们需要在字符串的开头或者结尾插入另一个特殊字符,比如说"*",防止它无休止地匹配下去. 变量声明: mx:当前已经判断过的能成为回文串的最远长度.比如说如果字符串为bacaba…
题目链接:http://poj.org/problem?id=3974 题意:求出给定字符串的最长回文串长度. 思路:裸的Manacher模板题. #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> using namespace std; +; typedef long l…
求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复杂度为O(n). 求最长回文子串这个问题,我听说有个分治+拓展kmp的算法,后缀数组也可以. 但是对于求回文串来说,manacher算法肯定有很多其他算法没有的优点. 现在进入正题: 首先,在字符串s中,用rad[i]表示第i个字符的回文半径,即rad[i]尽可能大,且满足: s[i-rad[i],…
Manacher算法能够在O(N)的时间复杂度内得到一个字符串以任意位置为中心的回文子串.其算法的基本原理就是利用已知回文串的左半部分来推导右半部分. 转:http://blog.sina.com.cn/s/blog_70811e1a01014esn.html 首先,在字符串s中,用rad[i]表示第i个字符的回文半径,即rad[i]尽可能大,且满足:s[i-rad[i],i-1]=s[i+1,i+rad[i]]很明显,求出了所有的rad,就求出了所有的长度为奇数的回文子串.至于偶数的怎么求,最…
3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 3097  Solved: 1408[Submit][Status][Discuss] Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行,为一个只包含小写字母(a -z)的非空字符串s. Output 输出一个整…
Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行,为一个只包含小写字母(a -z)的非空字符串s. Output 输出一个整数,为逝查回文子串的最大出现值. Sample Input [样例输入l] abacaba [样例输入2] www Sample Output [样例输出l] 7 [样例输出2] 4 解题思路: 1.Manacher+SAM…
Problem 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…
Manacher算法较传统算法的优化之处在于它对每个回文中心寻找回文半径的时候并不是都从半径为1开始找的,而是利用前面已经完成的任务,寻找一个初始的开始搜索的半径大小,复杂度是线性的. 参考博客:https://www.cnblogs.com/z360/p/6375514.html 下面附上hdoj的3068模板: #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll…
LINK:如果我让你查回文你还爱我吗 了解到了这个模板题. 果然我不会写2333... 考试的时候想到了一个非常辣鸡的 线段树合并+莫队的做法 过不了不再赘述. 当然也想到了manacher不过不太会用 所以就自闭了. 这道题 容易考虑到manacher而不是PAM. 考虑 在扩充后的字符串上做这个问题 这样就不需要考虑偶数回文串的条件了. 离线之后右端点不断移动 容易发现一个问题 某个点为中心的回文串个数标记在左端点上不过此时可能左端点够而右端点不太行. 一个trick 将区间分成两半 这样就…
manacher算法的由来不再赘述,自行百度QWQ... 进入正题,manacher算法是一个高效的计算回文串的算法,回文串如果不知道可以给出一个例子:" noon ",这样应该就很清晰了: 其实这个算法虽然名字长,但是实际代码很短,而且理解起来并不难...(连我这种蒟蒻都懂了) 这里给出模板题 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入格式 一行小写英文字符a,b,c...y,z组成的字符串S 输出格式 一个…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2342 思路:先跑一遍Manacher求出p[i]为每个位置为中心的回文半径,因为双倍回文串的长度一定是4的倍数,即偶数,那么对于Manacher的回文中心一定是'#'字符.所以我们枚举每个'#',对于每个'#'当回文半径大于等于4才有可能成为双倍回文.如果当前位置的i是'#'且满足以上条件.那么我们就找到i右边的j.因为双倍回文的长度是4的倍数,那么i右边的j的回文长度一定是2的倍数,即…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2565 题意:中文题 思路:定义L[i],R[i].表示以i为左端点/右端点时,最长回文串长度.那么答案就是L[i]+R[i]的最大值.问题转化为怎么求L[i],R[i].我们通过用Manacher可以求出以i为中心的最长回文串半径.然后再通过暴力+剪枝的方法对于每一个i和对应的最长半径求更新L[i],R[i]. #include<iostream> #include<cstdio…
给定一个字符串求出其中最长个公共回文串. 举列子: abab   -->回文串长度为2 以前的算法诸如: 扩展kmp求法过于麻烦,看到有一篇博文(http://leetcode.com/2011/11/longest-palindromic-substring-part-ii.html),写了一个关于这样的算法,按耐不住自己内心的小激动,就去学了下,于是将自己学习的一点点的理解记录下来: 它的处理方法是:  对于这样一个字符串: abab: a b a b     我们对于每一个字符串的进行逐个…
回文的含义是:正着看和倒着看相同,如abba和yyxyy        Manacher算法基本要点:用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个特殊的符号.比如 abba 变成 #a#b#b#a#, aba变成 #a#b#a#. 为了进一步减少编码的复杂度,可以在字符串的开始加入另一个特殊字符,这样就不用特殊处理越界问题,比如$#a#b#a#. P[id]:以字符str[id]为中心的最长回文串,当以str[id]为第一个字符时,这个…
题目大意:给以一个字符串,求出来这个字符串的最长回文串,不过这个字符串不是原串,而是转换过的,转换的原则就是先给一个字符 例如 'b' 意思就是字符把字符b转换成字符 a,那么c->b, d->c.....a->z,大致就是这么个意思,然后求出最大回文串就行(回文串至少长度也得等于2).   分析:字符转换没什么可说的,求回文串可以使用Manacher算法,主要说一下怎么用 p数组保存的信息求原来的区间,因为p保存的是扩展串的匹配数目,p[i]就是保存的最大匹配值,我们可以先求出来它的最…
1699: 回文串问题 时间限制: 1 Sec  内存限制: 128 MB 提交: 22  解决: 3 [提交][状态][讨论版] 题目描述 还是回文串问题,字符串是啥,大家应该都知道,就是满足 S[i] = S[L - i + 1] (1 <= i <= L)的串,现在遇到了一个问题,就是想问你一个字符串最少在后边加几个字符可以形成一个回文串,并最后输出形成的回文串 输入 输入包括多组数据,每组数据包含一个字符串 输出 输出转换后的回文字符串 样例输入 add cigartragic dxh…
2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1842  Solved: 935[Submit][Status][Discuss] Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串. Input 一行由小写…
题目链接:Longest Palindromic Substring 1. 问题描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 2. 各种解法复杂度 暴力枚举:O(N^2) 记忆化搜索:O(N…
用来求字符串最长回文串或者回文串的总数量 #include<map> #include<queue> #include<stack> #include<cmath> #include<vector> #include<stdio.h> #include<float.h> #include<string.h> #include<iostream> #include<algorithm> #…
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=3676 思路 好像还是回文自动机裸体,但是 \(\text{Manacher}\) +后缀自动机+倍增也可以解决. 首先可以一遍 \(\text{Manacher}\) 得到本质不同的回文串,然后分别求一次出现次数,更新答案.不能发现后缀自动机可以比较轻松的求出一个字串的出现次数,但是需要快速回答.所以需要快速找到一个字串在后缀自动机上的所属节点. 注意到后缀链接连接着一段后缀相等的位置,所…
链接:https://ac.nowcoder.com/acm/contest/549/B来源:牛客网 题目描述 小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的.所以小A只想知道给定的一个字符串的最大回文子串是多少,但是小A对这个结果并不是非常满意.现在小A可以对这个字符串做一些改动,他可以把这个字符串最前面的某一段连续的字符(不改变顺序)移动到原先字符串的末尾.那么请问小A通过这样的操作之后(也可以选择不移动)能够得到最大回文子串的长度是多少. 输入描述: 一行一个字符串表示给定的…
题目分析: 我写了史上最丑的后缀数组,怎么办? 首先manacher一遍两个串,这样只用考虑第三问.用$作为间隔符拼接两个串,把第一个串翻转.枚举回文中心,取最长的回文串,对于剩下的部分利用LCP匹配即可. 代码: #include<bits/stdc++.h> using namespace std; #define Sec first.second #define Fir first.first ; ]; string s1,s2,vk; ]; void read(){cin >&g…