想不到吧我還在更新哈哈哈哈哈。
今天帶來乙個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自動機。其每個結點就代表了乙個回文串 這與字尾自動機乙個結點代表多個字串不同 ...