COJ977 WZJ的資料結構(負二十三)

2022-05-04 01:09:10 字數 1793 閱讀 2507

試題描述

輸入乙個字串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#include

#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()

view code

為什麼是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#include

#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()

view code

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節點的權...