BZOJ3238 AHOI2013 差異 題解

2022-05-16 14:04:19 字數 886 閱讀 9769

參考:

第一道接觸字尾樹的題,然而不想講這個東西。

我們只需要知道將串倒著建字尾自動機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 這樣...