HDU3068 最长回文(manacher模板

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

Input输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000Output每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input

aaaa

abab

Sample Output

4
3
 1 #define maxn 1000010
 2 #include <cstdio>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <cstring>
 6
 7 using namespace std;
 8
 9 char str[maxn] ;//原字符串
10 char tmp[maxn << 1];//转换后的字符串
11 int Len[maxn << 1];
12
13 //转换原始串
14 int INIT(char *st)
15 {
16     int i, len = strlen(st);
17     tmp[0] = ‘@‘;//字符串开头增加一个特殊字符,防止越界
18     for (i = 1; i <= 2 * len; i += 2)
19     {
20         tmp[i] = ‘#‘;
21         tmp[i + 1] = st[i / 2];
22     }
23     tmp[2 * len + 1] = ‘#‘;
24     tmp[2 * len + 2] = ‘$‘;//字符串结尾加一个字符,防止越界
25     tmp[2 * len + 3] = 0;
26     return 2 * len + 1;//返回转换字符串的长度
27 }
28 //Manacher算法计算过程
29 int MANACHER(char *st, int len)
30 {
31     int mx = 0, ans = 0, po = 0;//mx即为当前计算回文串最右边字符的最大值
32     for (int i = 1; i <= len; i++)
33     {
34         if (mx > i)
35             Len[i] = min(mx - i, Len[2 * po - i]);//在Len[j]和mx-i中取个小
36         else
37             Len[i] = 1;//如果i>=mx,要从头开始匹配
38         while (st[i - Len[i]] == st[i + Len[i]])
39             Len[i]++;
40         if (Len[i] + i > mx)//若新计算的回文串右端点位置大于mx,要更新po和mx的值
41         {
42             mx = Len[i] + i;
43             po = i;
44         }
45         ans = max(ans, Len[i]);
46     }
47     return ans - 1;//返回Len[i]中的最大值-1即为原串的最长回文子串额长度
48 }
49
50
51 int main()
52 {
53     while(cin>>str){
54         int len = INIT(str);
55         cout<<MANACHER(tmp, len)<<endl;
56
57     }
58 }

原文地址:https://www.cnblogs.com/h404nofound/p/11719455.html

时间: 2024-10-14 04:31:34

HDU3068 最长回文(manacher模板的相关文章

hdu3068最长回文(Manacher算法)

简单来说这是个很水的东西.有点dp的思想吧.推荐两个博客,很详细. http://blog.csdn.net/xingyeyongheng/article/details/9310555 http://blog.csdn.net/ggggiqnypgjg/article/details/6645824 然后以为随便学点然后去复习,结果……呵呵.什么鬼数据,两行之间用空行隔开……没看到一直wa半节课…… hdu3068最长回文 var s1,s2:ansistring; s:array[0..10

[hdu3068 最长回文]Manacher算法,O(N)求最长回文子串

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意:求一个字符串的最长回文子串 思路: 枚举子串的两个端点,根据回文串的定义来判断其是否是回文串并更新答案,复杂度O(N3). 枚举回文串的对称轴i,以及回文半径r,由i和r可确定一个子串,然后暴力判断即可.复杂度O(N2). 在上一步的基础上,改进判断子串是否是回文串的算法.记fi(r)=(bool)以i为对称轴半径为r的子串是回文串,fi(r)的值域为{0, 1},显然fi(r)是关于r

HDU3068 最长回文 MANACHER+回文串

原题链接: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 每一行一

[hdu3068]最长回文(Manacher算法)

http://acm.hdu.edu.cn/showproblem.php?pid=3068 题目大意:求最长回文串的长度. 解题关键:Manacher算法 引用一个较好的解释 p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1; 可以这么说,这行要是理解了,那么马拉车算法基本上就没啥问题了,那么这一行代码拆开来看就是 如果mx > i, 则 p[i] = min(p[2 * id - i], mx - i) 否则, p[i] = 1 当 mx - i

hdu3068 最长回文 马拉车模板题

题目传送门 马拉车算法模板题. 学习博客 #include<bits/stdc++.h> #define clr(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; const int maxn=110010; char s[maxn<<1],ne[maxn<<1]; int p[maxn<<1],mx,maxx; int init(){ int len=strlen(s

[Hdu3068]最长回文[Manacher]

#include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> using namespace std; int p[210000]; char s[210000]; int main() { while(~scanf(&quo

HDU3068 最长回文【manacher算法】

最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 32452 Accepted Submission(s): 11908 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case

hdu 3068 最长回文(manacher&amp;最长回文子串)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7317    Accepted Submission(s): 2500 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

hdu-3068 最长回文 【Manacher算法】

Manacher算法学习资料:http://blog.csdn.net/dyx404514/article/details/42061017 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9282    Accepted Submission(s): 3194 Problem Description 给出一个只由小写英文字符