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