hdu4513--Manacher算法--回文串的O(n)算法

腾讯的比赛的题目的质量都很高 特别喜欢这题目背景 每题都很有意思

这题 也蛮难的 因为n太多了 一定要用O(n)的回文串算法来求

我是在这里学习的  传送

一般的话 都是char数组 使用特殊字符 表示插入 开头和末尾也是特别的字符 末尾的话是 ‘\0‘

这边的话 因为是Int数组  要注意下 0 和 末尾不能取相同值 这样会错的 插入的值 一定要在这个Height范围外

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 const int size = 100010;
 6 int height[size*2];
 7 int pos[size*2];
 8
 9 int main()
10 {
11     cin.sync_with_stdio(false);
12     int t , n , id , maxLen , ans;
13     cin >> t;
14     while( t-- )
15     {
16         cin >> n;
17         height[0] = -3;
18         for( int i = 1 ; i<=n ; i++ )
19         {
20             height[i*2-1] = -1;
21             cin >> height[i*2];
22         }
23         height[n*2+1] = -1;
24         height[n*2+2] = -2;
25         n = n * 2 + 2;
26         ans = maxLen = 0;
27         for( int i = 1 ; i<n ; i++ )
28         {
29             if( maxLen > i )
30             {
31                 pos[i] = min( pos[id*2-i] , maxLen-i );
32             }
33             else
34             {
35                 pos[i] = 1;
36             }
37             while( height[ i+pos[i] ] == height[ i-pos[i] ] )
38             {
39                 if( height[ i+pos[i] ] == height[ i-pos[i] ] == -1 )
40                 {
41                     ++ pos[i];
42                 }
43                 else if( height[ i+pos[i] ] <= height[ i+pos[i]-2 ] )
44                 {
45                     ++ pos[i];
46                 }
47                 else
48                     break;
49             }
50             if( i + pos[i] > maxLen )
51             {
52                 maxLen = i + pos[i];
53                 id = i;
54             }
55         }
56         for( int i = 0 ; i<n ; i++ )
57         {
58             ans = max( ans , pos[i]-1 );
59         }
60         cout << ans << endl;
61     }
62     return 0;
63 }

时间: 2024-12-20 12:18:13

hdu4513--Manacher算法--回文串的O(n)算法的相关文章

HDU 5371 Hotaru&#39;s problem (Manacher,回文串)

题意:给一个序列,找出1个连续子序列,将其平分成前,中,后等长的3段子序列,要求[前]和[中]是回文,[中]和[后]是回文.求3段最长为多少?由于平分的关系,所以答案应该是3的倍数. 思路:先Manacher求最长子串,利用期间所记录的P 数组,穷举一下所有可能的前两串,再用O(1)时间判断第3串是否符合要求. 具体做法: (1)P[i]记录的是以i为中心,从i-P[i]+1到i+P[i]-1这段都是回文.由于前两段之和必为偶数,所以必须选取str[i]为'#'的. (2)扫一遍每个'#',以其

Codeforces Round #427 (Div. 2) D. Palindromic characteristics(Manacher求回文串)

题目链接:Codeforces Round #427 (Div. 2) D. Palindromic characteristics 题意: 给你一个串,定义k-th回文串,让你求每个k-th的数量. 题解: manacher处理好后做一下dp就行了. 当然也可以直接dp不用manacher. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 5 cons

HDU 5340——Three Palindromes——————【manacher处理回文串】

Three Palindromes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1244    Accepted Submission(s): 415 Problem Description Can we divided a given string S into three nonempty palindromes? Input F

hdu 3294 manacher 求回文串

感谢: http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/ O(n)求给定字符串的以每个位置为中心的回文串长度. 中心思想:每次计算位置i的答案时,利用已经算出的1~i-1位置的答案. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define maxn 222222 5 using namespace std; 6 7

算法——回文串专题

双重回文数(复杂版) 题目链接:https://www.luogu.org/problemnew/show/P1207 回文串分割 题目链接:https://www.lintcode.com/problem/palindrome-partitioning/description 原文地址:https://www.cnblogs.com/czc1999/p/10362872.html

Manacher 入门+模板 回文串专用算法

Manacher 算法 回文串专用算法 manacher 人名,该算法的发明者.palindrome名词:回文. 博客推荐 https://www.cnblogs.com/lykkk/p/10460087.html,比较简洁,代码清晰. https://www.cnblogs.com/cloudplankroader/p/10988844.html, 一些细节的东西比较讲解比较细. 模板 //预处理函数,使得处理后的字符串长度为奇数,并且有一些比较好的性质 int init(char* s, c

(Manacher Algorithm, 中心拓展法,动态规划) leetcode 5. 最长回文串

解法一:中心拓展法.从下标为0开始遍历,将每个元素当作回文串中心,向两边拓展. 1)以这个字符为中心的回文串的长度(奇数串): 2)以这个字符和下个字符为中心的回文串的长度(偶数串). 注意:既要统计回文串为奇数时,又要统计回文串为偶数时.当 s[left]!=s[right] 时,left多减了1,right多加了1,所以在计算回文串开头时要把left+1,长度要是(right-1)-(left+1)-1 = right - left -1 class Solution { public: s

LeetCode 5 迅速判断回文串的曼切斯特算法

题意 Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Link: https://leetcode.com/problems/longest-palindromic-substring/ 翻译 给定一个字符串s,要求它当中的最长回文子串.可以假设s串的长度最大是1000. 样例 Example 1: Input:

马拉车,O(n)求回文串

body { font-family: sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10px; padding-bottom: 10px; background-color: white; padding: 30px } body>*:first-child { margin-top: 0 !important } body>*:last-child { margin-bottom: 0 !important } a