BZOJ3238 差異(字尾自動機)

2021-08-15 15:50:32 字數 1037 閱讀 5804

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])

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

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

構建出sam

後,pa

rent

樹反過來其實就是字尾樹

兩個字尾的lc

p 就是他們在字尾樹上lc

a 的深度

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

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

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 的順序問題 也就是先求出 sum n sum n i neq j len i 然後對於每個字尾樹上的節點,減去一下貢獻 也就是 size i size i 1 len i len i.parent ...

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