最長迴文串(manacher演算法)
最長迴文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 25520 Accepted Submission(s): 9422Problem 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 Inputaaaa abab
Sample Output4 3
manacher演算法的模板題目,可以在O(n)時間內計算出最長的迴文串,演算法講解如下
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn = 110050; char s1[maxn], s2[maxn * 2]; int p[maxn * 2], ans; //把'abab\0'這種普通的字串變成'$a#b#a#b#\0'便於計算 void init() { ans = 0; s2[0] = '$'; s2[1] = '#'; int i, j; for (i = 0, j = 2; s1[i]; ++i, ++j) { s2[j] = s1[i]; s2[++j] = '#'; } s2[j] = '\0'; } void manacher() { memset(p, 0, sizeof(p)); int id = 0, mx = 1;//初始化條件 for (int i = 1; s2[i]; ++i) {//p[0]不需要處理 p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1; while (s2[i - p[i]] == s2[i + p[i]]) ++p[i]; if (i + p[i] > mx) { mx = i + p[i]; id = i; } ans = max(ans, p[i] - 1); } } int main() { while (scanf("%s", s1) == 1) { init(); manacher(); printf("%d\n", ans); } return 0; }
相關推薦
最長迴文串(manacher演算法)
最長迴文Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 25520 Accepted Submission(s
最長迴文字串(Mancher演算法)
給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。示例 1:輸入: "babad" 輸出: "bab" 注意: "aba"也是一個有效答案。 示例 2:輸入: "cbbd" 輸出: "bb"思路:將字串中每一個元素作為中心算出其最大的迴文字串
L2-008. 最長對稱子串(manacher演算法)
今天學習了一下manacher演算法,比較難理解的是這一步,mx表示的是當前的對稱子串的最右端, id表示的這個子串的中間這個點。2*id-i 表示 i 關於 id 的對稱點 j p[i]=mx>
最長迴文串(leetcode簡單篇四百零九題)
給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。 在構造過程中,請注意區分大小寫。比如 “Aa” 不能當做一個迴文字串。 注意: 假設字串的長度不會超過 1010。 示例 1: 輸入: “abccccdd” 輸出:
LeetCode 409. 最長迴文串(C、C++、python)
給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。 在構造過程中,請注意區分大小寫。比如 "Aa" 不能當做一個迴文字串。 注意: 假設字串的長度不會超過 1010。 示例 1: 輸入: "abccccdd" 輸出: 7 解釋:
java-最長迴文串-中心擴充套件演算法
import java.util.*; public class nk { public static void main(String[] args){ Scanner sc = new S
JAVA動態規劃(二)--最長公共子序列問題(LCS_subSequence)的三種解法與最長公共子字串(LCS_subString)的兩種解法與最長迴文串(LongestPalindrome)
動態規劃法 經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。 為了節約重複求相同子問題的時間,引入一個數組,不管它們是否對最終
L2-008. 最長對稱子串(馬拉車演算法)
對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定”Is PAT&TAP symmetric?”,最長對稱子串為”s PAT&TAP s”,於是你應該輸出11。 輸入格式: 輸入在一行中給出長度不超過1000的非空字串。 輸出格式:
manacher演算法(最長迴文串)
這是建立部落格記錄的第一個程式碼。 題目解釋: 子串:小於等於原字串長度由原字串中任意個連續字元組成的子序列 迴文:關於中間字元對稱的文法,即“aba”(單核)、“cabbac”(雙核)等 最長迴文子串:1.尋找回文子串;2.該子串是迴文子串中
求字串中最長迴文串的長度 manacher演算法 模板
https://www.luogu.org/problemnew/show/P3805 #include<bits/stdc++.h> using namespace std; const int maxn=11000002; char S[maxn<<1];
求最長迴文串 O(n)的manacher演算法
參考以下兩篇文章。。。 一篇程式碼清晰 一篇解析明確。。 http://blog.sina.com.cn/s/blog_70811e1a01014esn.html http://wenku.baidu.com/link?url=kX7ZdfzHW7SM0cE8Vv
最長迴文串-manacher演算法模板
給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度. 迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S 兩組case之間由
HDU3068-manacher演算法-最長迴文串
https://vjudge.net/problem/HDU-3068 求最長的迴文串。 有一次用dp求過一次。 :我們都知道求迴文串可以依賴於暴力的方法(以某點為重心,暴力的比唄),manach
Manacher演算法,最長迴文串,時間複雜度O(n)
最長迴文子串 問題 對於一個字串,請設計一個高效演算法,計算其中最長迴文子串的長度。 給定字串A以及它的長度n,請返回最長迴文子串的長度。 測試樣例: “abc1234321ab”,12 返回:7 中心擴充套件到Manache
Hdu 3068 Manacher演算法求最長迴文串長度
最長迴文 Description 給出一個只由小寫英文字元a,b,c…y,z組成的字串S,求S中最長迴文串的長度. 迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b
manacher演算法求最長迴文串
求最長迴文串可以使用manacher演算法來達到O(n)時間內得出結果,之所以降到O(n)是因為減少了很多重複匹配。 思路如下: 1.把所有字串都變成奇數個字母的串,方法很簡單,就是在所有字母前後加一個特殊字元,比如常用’#’,這樣長度為n的串就變成了長度為
Longest Palindromic Substring (最長迴文串)【面試演算法leetcode】
題目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exis
manacher演算法求最長迴文串 和 hdu 3068 最長迴文串
1. 迴文串定義 迴文串是一個正讀和反讀都一樣的字串,比如“aba”或者“abba”等等就是迴文串。 2. 最長迴文子串方法 最長迴文子串的長度方法可以有三種方法: 1) 樸素演算法是依次以每一個字元為中心向兩側進行擴充套件,時間複雜度是O(N^2)的; 2) 利用
演算法 -- 四種方法獲取的最長“迴文串”,並對時間複雜進行分析對比&PHP
迴文串: “迴文串”是一個正讀和反讀都一樣的字串,比如“level”或者“noon”等等就是迴文串。 -- 來自百度百科 關於獲取字串中最長的迴文串的演算法中,目前有很多演算法,本文中主要是用PHP來實現的演算法之一。 演算法一:暴力解法 暴力計算出所有的字串並判斷。時間複雜
求最長迴文串-從動態規劃到"馬拉車"之路(下)
預備知識: (1)在一個數軸上有兩點i和j(i<=j)關於點m對稱,那麼有 i = 2m-j; 證明: 因為 i<=j 且 i 和 j 關於 m 對稱,那麼有 (i + j)/ 2 = m 所以 i = 2m - j; (2)迴文串的對稱性: 由迴文串的