P6139 模板 廣義字尾自動機 廣義 SAM

2021-10-10 20:54:25 字數 847 閱讀 5173

求n

nn個串的不同子串個數

如何在sam

samsa

m中插入多個字串。

可以我們可以通過更改las

tlast

last

為之前的節點來做,如果插入乙個之前插入過的節點就按照之前sam

samsa

m的方法特判就好了。

#include

#include

#include

#define ll long long

using

namespace std;

const ll n=

2e6+10;

ll n,m,cnt,last,len[n]

,fa[n]

,ch[n][26

],ans;

char s[n]

;ll ins

(ll c,ll last)

} ll np=

++cnt;len[np]

=len[p]+1

;for

(;p&&

!ch[p]

[c];p=fa[p]

)ch[p]

[c]=np;if(

!p)fa[np]=1

;else

}return np;

}int

main()

for(ll i=

1;i<=cnt;i++

) ans+

=len[i]

-len[fa[i]];

printf

("%lld"

,ans)

;}

廣義字尾自動機(廣義SAM)

參考部落格 學習筆記 字串 廣義字尾自動機 廣義字尾自動機適用於多串的子串問題。它的dfa可以識別多串中的任意乙個子串。同時也有類似 sam 的一些性質。模板提交處 根據參考部落格所說,有好幾種 假 寫法。比如 每乙個串的開頭設定 lst 為 1 多串拼成乙個大串,中間用 連線 等等 正規寫法 例題...

廣義字尾自動機小結

字尾自動機功能很強大,但碰到多串問題就掛。廣義字尾自動機支援多串操作。思想是在每次插入乙個串後,把las設為1即可,其它操作在parent樹上進行表演。bzoj 3277 includeusing namespace std typedef long long ll const int n 3e5 ...

字尾自動機模板

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 ...