Hdu 3068 最长回文字串Manacher算法

题目链接

最长回文

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7976    Accepted Submission(s): 2735

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 Input

aaaa

abab

Sample Output

4
3

关于Manacher算法的介绍,网上可以找到很多资料。O(N)

Accepted Code:

 1 /*************************************************************************
 2     > File Name: hdu_3068.cpp
 3     > Author: Stomach_ache
 4     > Mail: [email protected]
 5     > Created Time: 2014年08月04日 星期一 18时44分05秒
 6     > Propose: hdu3068, poj3974
 7  ************************************************************************/
 8 // Manacher O(n)
 9 #include <cmath>
10 #include <string>
11 #include <cstdio>
12 #include <fstream>
13 #include <cstring>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std;
17
18 const int maxn = 100005;
19 char s[maxn], str[maxn<<1];
20 int p[maxn<<1], n;
21
22 void Manacher() {
23       n = strlen(s);
24     str[0] = ‘$‘;
25     str[1] = ‘#‘;
26     for (int i = 0; i < n; i++) {
27         str[i*2+2] = s[i];
28           str[i*2+3] = ‘#‘;
29     }
30     n = n * 2 + 2;
31     str[n] = 0;
32
33     int mx = 0;
34     int id;
35     for (int i = 1; i < n; i++) {
36           if (mx > i) p[i] = min(p[2*id-i], mx - i);
37         else p[i] = 1;
38         for ( ;str[i-p[i]] == str[i+p[i]]; p[i]++);
39         if (p[i] + i > mx) {
40               mx = p[i] + i;
41             id = i;
42         }
43     }
44 }
45
46 void solve() {
47     Manacher();
48     int ans = 0;
49     for (int i = 0; i < n; i++) ans = max(ans, p[i]);
50     printf("%d\n", ans - 1);
51 }
52
53 int main(void) {
54       while (~scanf("%s", s)) {
55           solve();
56     }
57
58     return 0;
59 }

Hdu 3068 最长回文字串Manacher算法

时间: 2024-10-17 17:59:23

Hdu 3068 最长回文字串Manacher算法的相关文章

HDU - 3068 最长回文(manacher算法)

题意:给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 分析: manacher算法: 1.将字符串中每个字符的两边都插入一个特殊字符.(此操作的目的是,将字符串长度统一变成奇数,道理很容易想---奇数+偶数=奇数or偶数+奇数=奇数) eg:abba--->#a#b#b#a# 此外,为了便于处理边界,可在字符串开始处再加另外一个特殊字符. eg:#a#b#b#a#--->$#a#b#b#a# 2.数组 P[i] 来记录以字符S[i]为中心的最长回文子串向

HDU 3068 最长回文(Manacher算法模板)

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: a

hdu 3068 最长回文串 o(n) Manacher 算法

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

HDU 3068 最长回文(Manacher模板题)

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

hdoj 3068 最长回文 【manacher算法】

题意... 用传统的方法来做的话,要超时(就是要进行奇偶判断). manacher算法,百度一下讲解好的有很多. 纪念粘代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define M 110010 char a[M], b[M<<1]; int p[M<<1]; int main(){ while(~scanf("

Palindrome(最长回文串manacher算法)O(n)

Palindrome Time Limit:15000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Andy the smart computer science student was attending an algorithms class when the professor asked the students a simple question, "

Hdu 3068 最长回文(Manacher模版题)

#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int N=220010; using namespace std; char str[N]; char tmp[N]; int len[N]; int init(){ tmp[0]='$'; int i=0,nlen=1; while(str[i]!='\0'){ tmp[nlen++]='#'; tmp[n

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 输入有多组

最长回文字串理解(学习Manacher&#39;s algorithm)

关于字符串的子串问题,我们经常需要利用的是已经访问的部分的信息,来降低复杂度,和提高效率:在求最长回文子串的问题中,Manacher's algorithm提供了一种很好的机制,虽然部分地方不太容易理解 先说下核心的思想:先对原字符串进行预处理,将字符串"abc"转换为"$#a#b#c#"的形式,既避免了访问越界的问题,又保证每一个字符有至少一个对称的串(真字符,或是假的“#”) 预留两对变量(当前得到的中心位置“center”,和字符串右侧最远位置“R”,以及对称