參考:
第一道接觸字尾樹的題,然而不想講這個東西。
我們只需要知道將串倒著建字尾自動機parent樹就是字尾樹即可。
然後兩個字尾的lcp就是他們的lca的len。
設點u,則過點u的字尾就有su子樹的size和個,所以能配出size[u]*(size[u]-1)/2個對,這條路徑的長度貢獻為(tr[u].l-tr[f].l)
ps:貢獻不是tr[u].l,因為過u的字尾最長的不一定為tr[u].l,所以要一段一段處理。
#include#include#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;const
int n=1e6+5
;struct
treetr[n];
struct
nodee[n];
char
s[n];
intlast,cnt,tot,size[n],head[n];
inline
void add(int u,int
v)inline
void insert(int
c) }
size[np]=1;}
ll ans=0
;void dfs(int u,int
f) ans-=(ll)size[u]*(size[u]-1)*(tr[u].l-tr[f].l);
}int
main()
3238 Ahoi2013 差異 字尾自動機
哈哈這道題自己yy出來了很開心 不過ozy大神告訴我與lca有關 最長公共字首稍微想想都覺得很難搞,畢竟是字尾自動機,所以把原字串反過來建,然後變成了求最長公共字尾。對於兩個字尾,若他們在字尾自動機上對應的節點分別為 x x 和y role presentation style position r...
bzoj3238 差異 字尾樹
題目大意 給你乙個字串 s 設 s i 是串 s 第 i 長的字尾,求 sum limits sum limits s i s j 2 times lcp s i,s j 其中 lcp x,y 表示字串 x 和字串 y 的最長公共字首 資料範圍 s 500000 最近發現字尾樹和 sam 沒學好,找...
BZOJ3238 差異(字尾自動機)
bzoj 前面的東西直接暴力算就行了 其實沒必要算的正正好 為了方便的後面的計算 我們不考慮i,j 的順序問題 也就是先求出 n i 1 nj 1 i j len i 然後對於每個字尾樹上的節點,減去一下貢獻 也就是siz e i si ze i 1 le n i len i.p aren t 這樣...