好的講解manacher演算法的文章,**並茂。
題意:求給定串的最長回文子串(
2009
多校題目)
分析:列舉每個點向左向右擴充套件,看最遠能擴充套件到哪兒
.但是普通的列舉是
n^2的,肯定超時。現在我們想
kmp或擴充套件
kmp一樣,給字串定義乙個
nex陣列,
nex[i]
表示以i
為中心最遠能向右擴充套件的長度,使得
s[i – nex[i] + 1……. i + nex[i]- 1]
形成的回文。然後我們利用這個陣列,在
o(n)
的時間內求出每個i的
nex[i]
。在其他演算法中,奇數回文和偶數回文經常給我們帶來麻煩,這個演算法中,我們第一步要進行的是將每個字元後邊(包括開頭)加入乙個字元(不在串兒的字符集中就行),一般用
』#」.
這樣就都轉換為了奇數的情況。例如:
abba
(偶)改為 #a#b#b#a# (
最長為以第3個
#為中心
) aba
(奇)改為
#a#b#a# (
最長為以
b為中心
)剩下的就是在我們知道了
nex[0]…….nex[i – 1]
後如何求
nex[i];p
記錄前i-1
個字元中以某個字元
id為中心最遠能向右擴充套件到的位置。
//file name: 3068.cpp
//author: zlbing
//created time: 2013/5/9 13:30:20
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define cl(x,v); memset(x,v,sizeof(x));
#define inf 0x3f3f3f3f
#define ll long long
#define rep(i,r,n) for(int i=r;i<=n;i++)
#define rrep(i,n,r) for(int i=n;i>=r;i--)
const
int maxn=2e5;
char str[maxn],str1[maxn*2
];int n,ans,nxt[maxn*2
];void
manacher()
}}void
pre()
str1[k++]='#'
; str1[k]='\0'
; n=k;
}int
main()
return0;
}
HDU 3068 最長回文
題 目 鏈 接 看完後自己寫了一遍,感覺真的是很神奇的結論啊!本來這題看到可以用字尾陣列來寫的,但沒有學過,去看了一下,真心給暈了,決定找個機會認真研究下。我的 include include includeusing namespace std define min a,b a b a b cha...
HDU 3068 最長回文
存在o n 的演算法,學習了一下 include include includeusing namespace std const int maxn 300011 int n,p maxn char str maxn in maxn int main str 0 str 1 n n 2 2 str ...
HDU 3068 最長回文
problem description 給出乙個只由小寫英文本元a,b,c.y,z組成的字串s,求s中最長回文串的長度.回文就是正反讀都是一樣的字串,如aba,abba等 input 輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c.y,z組成的字串s 兩組case之間由空行...