博主鏈結
給乙個字串,輸出這個串的不同子串數量
直接拿串跑字尾自動機就可以,然後每個狀態點子串的數量等於len[i]-len[link[i],把所有的狀態點的子串數量加起來就是不同子串數
#include
#include
#define maxc 28
using namespace std;
const
int maxn =
1e6+5;
const
int mod =
1e9+7;
typedef
long
long ll;
int len[maxn *2]
,//最長子串的長度(該節點字串數量=len[x]-len[link[x]])
link[maxn *2]
,//字尾鏈結(最短串前部減少乙個字元所到達的狀態)
cnt[maxn *2]
,//被字尾連線的數
nex[maxn *2]
[maxc]
,//狀態轉移(尾部加乙個字元的下乙個狀態)(圖)
idx,
//節點編號
last;
//最後節點
ll epos[maxn *2]
;// enpos數(該狀態子串數量)
void
iint()
void
extend
(int c)
} last = x;
//更新最後處理的節點
}void
getcnt()
}char str[maxn]
;int
main()
字尾自動機學習筆記2(hiho128周)
字尾自動機最出名的應該是其時空複雜度均為o length s 想要實現o length s 的構造,我們對於每個狀態不能儲存太多資料。例如substring st 肯定是沒法儲存下來了。對於狀態st我們只儲存如下資料 maxlen st st包含的最長子串的長度 minlen st st包含的最短字...
hiho一下 第128周 字尾自動機
求給定字串s不同子串的個數 即求該字串構成的字尾自動機裡面包含了多少個字尾 等價於求這個字尾自動機裡面的路徑的個數 每個字尾自動機節點所包含的字尾集合大小為len p len link p 其中len為該節點到根的長度,link為該節點的字尾鏈結 求和輸出即可 include include inc...
hihocoder 字尾自動機四 重複旋律6
題目 對於 k in 1,n 求出長度為 k 的子串出現次數最多的出現了多少次 我直到現在才理解字尾自動機上的子樹和是什麼意思 非常顯然的一點是 endpos link u endpos u 考慮到 link u 有多個兒子 於是還需要 endpos 的另外乙個性質 endpos u endpos ...