試題描述
輸入乙個字串s,輸出s的最長連續回文子串長度。
輸入輸入乙個字串s。
輸出輸出s的最長連續回文子串長度
輸入示例
abacbbc
輸出示例
4其他說明
1<=|s|<=1000000
這就是傳說中的萌萌噠馬拉車演算法(manacher)啦
首先為了方便處奇偶兩種情況,將s重新變成新的字串t,如abacddc變成#a#b#a#c#d#d#c#
再次為了方便處理越界,將字串首尾加乙個奇怪的不匹配字元,如將abacddc變成~#a#b#a#c#d#d#c#`
請大家想一想這樣的好處
考慮暴力演算法,列舉回文串中心,暴力向兩邊匹配
rep(1,n-1這樣是o(n^2),考慮優化)
我們定義p[i]表示位置i的最長匹配長度,考慮利用之前的匹配資訊。
這樣就是p[i]=p[2*id-i]
這樣就是p[i]=mx-i
寫成**就是這樣
#include#includeview code#include
#include
#include
#define rep(s,t) for(int i=s;i<=t;i++)
#define ren for(int i=first[x];i!=-1;i=next[i])
using
namespace
std;
inline
intread()
const
int maxn=2000010
;char
s[maxn];
intp[maxn];
int solve(char*s2)
return
ans;
}char
s2[maxn];
intmain()
為什麼是o(n)的呢?
因為演算法只有遇到還沒有匹配的位置時才進行匹配,已經匹配過的位置不再進行匹配,所以對於t字串中的每乙個位置,只進行一次匹配,所以manacher演算法的總體時間複雜度為o(n),其中n為t字串的長度,由於t的長度事實上是s的兩倍,所以時間複雜度依然是線性的。
補乙個pam的(以後不能裝*,將」f[np]=to[k][c];to[p][c]=np;「i寫成」f[to[p][c]=np]=to[k][c];「就會t飛,因為k可能等於p)
#include#includeview code#include
#include
#include
#define rep(s,t) for(int i=s;i<=t;i++)
#define ren for(int i=first[x];i!=-1;i=next[i])
using
namespace
std;
inline
intread()
const
int maxn=1000010
;char
ch[maxn];
struct
pam
void extend(int c,int
n) last=to[p][c];
}intsolve()
}sol;
intmain()
COJ0985 WZJ的資料結構(負十五)
coj0985 wzj的資料結構 負十五 試題描述 chx有乙個問題想問問大家。給你乙個長度為n的數列a,請你找到兩個位置l,r,使得a l a l 1 a r 中沒有重複的數,輸出r l 1的最大值。以上是附中聯賽加試的一道題。wzj覺得這道題太水了,改了改題目 wzj有乙個問題想問問大家。給你乙...
COJ0989 WZJ的資料結構(負十一)
coj0989 wzj的資料結構 負十一 試題描述 給出以下定義 1.若子串行 l,r 的極差 最大值 最小值 m,則子串行 l,r 為乙個均勻序列。2.均勻序列 l,r 的權值為sum l,r 即序列的元素和。現在給你乙個長度為n的整數序列a,請你求出權值前k大的均勻序列,輸出k行為它們的權值。輸...
COJ 0970 WZJ的資料結構(負三十)樹分治
wzj的資料結構 負三十 難度級別 d 執行時間限制 1000ms 執行空間限制 262144kb 長度限制 2000000b 試題描述 給你一棵n個點的無根樹,點和邊上均有權值。請你設計乙個資料結構,回答m次操作。1 x v 對於樹上的每乙個節點y,如果將x y在樹上的距離記為d,那麼將y節點的權...