字串系列(六) 回文自動機

2021-08-20 19:00:49 字數 2550 閱讀 6184

想不到吧我還在更新哈哈哈哈哈。

今天帶來乙個2023年發明的演算法——回文自動機。

既然寫了這篇部落格,那我就說得全面一些。

這個演算法也稱回文樹。

可以模擬一些其他的自動機,回文自動機也是有許多節點、許多next、許多fail的。

1、節點的那些事

每個節點都表示乙個回文子串(注意了啊,只表示乙個,sam才是一類),且任意兩個節點所表示的串必定不全等。(可以用數歸證明,乙個長度為n的串,其本質不同的回文子串數在o(n)級別)

2、陣列定義ne

xt[i

][c]

n ex

t[i]

[c]表示在i節點所代表的串的兩端各新增乙個字元c,得到的那個新回文子串所在的節點。 fa

il[i

] fai

l[i]

表示i節點的串的最長回文字尾。 cn

t[i]

c nt

[i]表示這個串共出現了幾次。 le

n[i]

l en

[i]表示節點i這個串的長度。 nu

m[i]

n um

[i]表示這個串有多少回文字尾。

int nxt[n][26]; //i節點對應的回文串在兩邊各加乙個字元後變成的節點編號

intfail[n]; //fail[i]表示的串是i的最長字尾回文串

int cnt[n]; //表示這個串出現過幾次

int num[n]; //節點i這個串的字尾有多少是回文的

int len[n]; //節點i表示的回文串的長度

int s[n]; //s[i]是第i次新增的字元

int last; //以n結束的最長回文串所在的節點

int n; //目前新增的字元個數

int p; //下乙個新建節點的標號

3、回文串長度奇偶處理

在初始時,0節點賦0的長度,1節點賦-1的長度。last指向0,0的fail指向1。同時str[0] = -1。

具體原因不講。

inline

int newnode(int l)

inline

void init()

4、判斷合法

新加進來乙個字元時,只有st

r[nn

ow−l

en[x

]−1]

=str

[nno

w]s tr

[nno

w−le

n[x]

−1]=

str[

nnow

]我們才可以說是能構成乙個新的回文串(構成回文節點唯一方法,就是在已有基礎上找乙個節點,在其兩端各拓展乙個字元,也就是我們所說的找到乙個x,使式子成立)。

於是我們就可以去不停給last跑fail,直到滿足條件。

inline int get_fail(int x)
5、加乙個字元進來
inline void add(int c) 

last = nxt[cur][c];

++cnt[last];

}

5、把cnt搞對
inline

void dp()

加完所有串之後,dp一下才對。

這個東西極妙,最好背一下板子。

貼乙個【ap

io2014

】 【ap

io2014

】回文串的co

dec od

e:

#include 

#define n 300010

inline

long

long mymax(long

long x, long

long y)

struct palindromic_tree

inline

void init()

inline

int get_fail(int x)

inline

void add(int c)

last = nxt[cur][c];

++cnt[last];

}inline

void dp()

inline

void work()

dp(); long

long ans = 0;

for(int i = p - 1; i >= 0; --i) ans = mymax(ans, 1ll * cnt[i] * len[i]);

printf("%lld", ans);

}}pdtree;

int main()

字串 回文自動機

回文自動機學習部落格 我喜歡這個 風格 這個思想講解的更好 思路 對a b跑一次回文自動機,然後分別搜偶數長度的串,奇數長度串。code include define ll long long using namespace std const int ax 2e5 666 char a ax ch...

LOJ141 回文子串(回文自動機)

雙向pam板子,同時維護最長回文字首和最長回文字尾,和原來沒什麼區別,只需要注意當整個串成為乙個回文串的時候需要維護一下兩個指標。include define ll long long define re register define gc get char define cs const nam...

APIO2014 回文串 回文自動機moban

與manacher 字尾自動機倍增匹配相比快太多。manacher sam寫法 以上是回文自動機的速度 以上是manacher sam的速度。感受一下。受個人lj 的常數影響 回文自動機是乙個類字典樹,構造方式又類似於ac自動機。其每個結點就代表了乙個回文串 這與字尾自動機乙個結點代表多個字串不同 ...