1. 程式人生 > >最長迴文串(manacher演算法)

最長迴文串(manacher演算法)

最長迴文

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

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 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)迴文串的對稱性:  由迴文串的