hiho 第1周 最长回文子串(manacher)

裸题。原理看代码很好理解的。

 1 //hiho 第1周
 2 #include <set>
 3 #include <map>
 4 #include <queue>
 5 #include <deque>
 6 #include <stack>
 7 #include <cmath>
 8 #include <cstdio>
 9 #include <vector>
10 #include <string>
11 #include <cstring>
12 #include <fstream>
13 #include <iostream>
14 #include <algorithm>
15 using namespace std;
16
17 #define eps 1e-8
18 #define PI acos(-1.0)
19 #define INF 0x3f3f3f3f
20 #define FAST_IO ios::sync_with_stdio(false)
21
22 typedef long long LL;
23 const int N=1e6+10;
24 char str[N];
25
26 int solve(){
27     int ans=1;
28     for(int i=1;str[i];i++){
29         int s=i,e=i;
30         while(str[e+1]==str[i]) e++;
31         i=e;
32         while(str[s-1]==str[e+1]) s--,e++;
33         if((e-s+1)>ans) ans=e-s+1;
34     }
35     return ans;
36 }
37
38 int main(){
39     str[0]=‘$‘;
40     int n;
41     scanf("%d",&n);
42     while(n--){
43         scanf("%s",str+1);
44         printf("%d\n",solve());
45     }
46     return 0;
47 }

原文地址:https://www.cnblogs.com/ehanla/p/9594112.html

时间: 2024-10-29 12:42:10

hiho 第1周 最长回文子串(manacher)的相关文章

hiho一下 第一周 最长回文子串

时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?” 小Ho奇怪的问道:“什么叫做最长回文子串呢?” 小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串指的是12421这种从前往后读和从后往

hiho一下第一周——最长回文子串

题目连接 http://hihocoder.com/problemset/problem/1032 题目分析 类似于KMP的思想,利用已经匹配的信息计算未匹配的信息. 基本原理就是:我们将f[i]定义为以i为中心的最长回文串长度.那么如果有f[5]=7,f[4]=3, 那么我们可以得到f[6] >=3.以此来减少比较次数.当然还有一些细节要处理.比如回文串长度的奇偶性. 代码 这个是我自己写的版本,不是很精简. #include <iostream> #include <algor

hiho 第1周 最长回文子串

题目链接:http://hihocoder.com/problemset/problem/1032 #include <bits/stdc++.h> using namespace std; bool table[10000][10000] = {false}; string longestPalindromeDP(string s) { int n = s.length(); int longestBegin = 0; int maxLen = 1; memset(table,0,sizeo

HiHo 1032 最长回文子串 (Manacher算法求解)

Manacher算法o(n)求解最长回文子串问题 非常巧妙 #include<bits/stdc++.h> using namespace std; char str[2000020],s[2000020]; int p[2000020]; int len,id,mx; void pre() //对字符串进行预处理 { len=strlen(s); str[0]='$'; str[1]='#'; for(int i=0;i<len;i++) { str[i*2+2]=s[i]; str[

hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?" 小Ho奇怪的问道:"什么叫做最长回文子串呢?" 小Hi回答道:"一个字符串中连续的一

最长回文子串 - Manacher算法

算法思想: 设有字符串s[] = "121" 第一步:通过在每个字符左右都添加一个特殊字符,把奇数长度和偶数长度的字符串都转化成奇数(例如. "121" 加上特殊字符后变成"#1#2#1" ),同时也可在开头再加一个特殊字符,以便于忽略越界问题(如上例"121"变成"$#1#2#1#"  此时开头的特殊字符$和字符串末尾的\0与此串中其他字符都不同,即可忽略越界问题),此时字符串变成 s[] = "

hihocoder 1032 : 最长回文子串(Manacher)

之前做过类似的题,只是理解了,还没达到驾轻就熟,想到即敲出的地步,所以再练一次. 顺带将Manacher算法思想解释一遍,加强印象,也算作分享吧. Manacher 我们用f(x)表示以x位置为中心的回文串的长度 j相对i的对应位置是j' 那么f(j)与f(j')和f(i)有什么关系呢. 先看第一张图,下面那条横杠表示f(i),那么,既然j'与j相对应,j'的回文串长度已经求出,那么j位置的回文串长度一定是大于等于j'长度的. 即f(i) >= f(j')=f(i*2-j) 但是还存在上图这样的

hihoCoder #1032 : 最长回文子串 [ Manacher算法--O(n)回文子串算法 ]

传送门 #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?” 小Ho奇怪的问道:“什么叫做最长回文子串呢?” 小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串

吉哥系列故事——完美队形II---hdu4513(最长回文子串manacher)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4513 题意比最长回文串就多了一个前面的人要比后面的人低这个条件,所以在p[i]++的时候判断一下s[i-p[i]]<=s[i-p[i]+2]就可以了; 用最长回文串算法manacher:套一下模板就可以了: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; con