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