BZOJ3238 差異(字尾自動機)

2022-03-20 07:13:02 字數 780 閱讀 8977

bzoj

前面的東西直接暴力算就行了

其實沒必要算的正正好

為了方便的後面的計算

我們不考慮\(i,j\)的順序問題

也就是先求出\(\sum_^n\sum_^n[i\neq j]len[i]\)

然後對於每個字尾樹上的節點,減去一下貢獻

也就是\(size[i]*(size[i]-1)*(len[i]-len[i.parent])\)

這樣的話,就很容易計算了。。

我知道我寫的一點都不清楚

構建出\(sam\)後,\(parent\)樹反過來其實就是字尾樹

兩個字尾的\(lcp\)就是他們在字尾樹上\(lca\)的深度

所以前面的應該好理解一點點了。。。。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define max 500500

inline int read()

struct node

t[max<<1];

char ch[max];

int a[max<<1],c[max<<1],size[max<<1];

int last=1,tot=1;

void extend(int c)

} size[np]=1;

}long long ans;

int main()

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

BZOJ3238 差異 字尾自動機 dp

題意 分析這個題目還是很優秀的。sigma len ti len tj 的值是一定的 n n 1 n 1 2。那麼關鍵就是求任意兩個字尾的lcp的和了。我們怎麼求兩個字尾的lcp?如果用字尾自動機的話,我們可以先把字串反過來,然後建字尾自動機,那麼兩個字尾的lcp就是他們兩個在parent樹上的最近...

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 沒學好,找...