hihocoder 字尾自動機四 重複旋律6

2022-03-27 04:56:50 字數 1223 閱讀 9235

題目

對於\(k\in[1,n]\)求出長度為\(k\)的子串出現次數最多的出現了多少次

我直到現在才理解字尾自動機上的子樹和是什麼意思

非常顯然的一點是

\[endpos(link(u))⊇endpos(u)

\]考慮到\(link(u)\)有多個兒子

於是還需要\(endpos\)的另外乙個性質

\[endpos(u)∩endpos(v)=\varnothing

\]當且僅當\(u\)不是\(v\)的字尾的時候

顯然\(parent\)樹上不可能有兩個非父子節點的存在字尾關係

把\(link(u)\)的不同兒子的\(|endpos|\)加在一起並不會導致重複

但是就不會漏了嗎

會漏的呀,我們非常顯然的漏掉了\(link(u)\)自己產生的那個字首的字尾

但是什麼樣的節點會有乙個自己的獨一無二的字首的字尾呢,非常明顯只有那些直接插入到\(sam\)裡的點了

之後我們把\(parent\)樹建出來,之後求一下子樹和,\(u\)節點的\(sz[u]\)我們對應到\(len[u]\)上去,之後乙個字尾最大值就是答案了

**

#include#include#define maxn 1000005

#define re register

#define max(a,b) ((a)>(b)?(a):(b))

char s[maxn];

int n,lst=1,cnt=1,num;

struct e e[maxn<<1];

int sz[maxn<<1],fa[maxn<<1],len[maxn<<1],head[maxn<<1],son[maxn<<1][26],beh[maxn];

inline void add(int x,int y)

void dfs(int x)

inline void ins(int c)

int x=son[f][c];

if(len[f]+1==len[x])

int y=++cnt;

len[y]=len[f]+1,fa[y]=fa[x],fa[x]=fa[p]=y;

for(re int i=0;i<26;i++) son[y][i]=son[x][i];

while(f&&son[f][c]==x) son[f][c]=y,f=fa[f];

}int main()

hihocoder1465 字尾自動機 迴圈同構

hihocoder1465 描述小hi平時的一大興趣愛好就是演奏鋼琴。我們知道一段 旋律可以被表示為一段數構成的數列。小hi發現旋律可以迴圈,每次把一段旋律裡面最前面乙個音換到最後面就成為了原旋律的 迴圈相似旋律 還可以對 迴圈相似旋律 進行相同的變換能繼續得到原串的 迴圈相似旋律 小hi對此產生了...

字尾自動機

基礎知識 step i 表示的是字串i在原字串中的位置。pareint i 表示root到parent i 的子串是root到i的最長字尾。字尾自動機遍歷可以得到原字串的所有子串。特殊技巧 一 字尾自動機的不同子串數有兩種求法 1.ans step i step parent i 1 i cnt 2...

字尾自動機

常用於處理字串問題,可以高效解決許多字串問題。有點像將乙個字串的所有字尾都建在乙個ac自動機上,但不同的是字尾自動機的節點數最多為2 n,因為它只記錄需要記錄的點,一些沒有記錄東西的點可以視為與下面有價值的節點並在一起,這樣大大降低了時間複雜度和空間複雜度。對於每乙個節點記錄它的後面加上每個字元後字...