BZOJ3238 差異 字尾自動機 dp

2022-05-27 13:51:09 字數 1028 閱讀 6701

題意

分析這個題目還是很優秀的。sigma(len(ti)+len(tj))的值是一定的=n*(n+1)*(n-1)/2。那麼關鍵就是求任意兩個字尾的lcp的和了。

我們怎麼求兩個字尾的lcp?如果用字尾自動機的話,我們可以先把字串反過來,然後建字尾自動機,那麼兩個字尾的lcp就是他們兩個在parent樹上的最近公共祖先(lca)的len。我們要求的是任意兩個字尾的lcp的和,我們可以考慮在parent上跑樹形dp。令dp[u]為以u為lca的lcp的和。

1 #include 2 #include 3 #include 4 #include 5

6using

namespace

std;

7 typedef long

long

ll;8

const

int maxn=500000+100;9

intn;

10char

s[maxn];

11struct

statest[2*maxn];

15int

last,cur,sz;

16int c[2*maxn],cnt[2*maxn];

17 ll dp[2*maxn];

18void

init()

24void build_sam(int

c)47

}48 last=cur;49}

50int cmp(int a,int

b)53

intmain()68}

6970 ll ans=(ll)n*(n+1)*(n-1)/2;71

for(int i=0;i)

74 printf("

%lld\n

",ans);

7576

return0;

77 }

view code

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 差異(字尾自動機)

bzoj 前面的東西直接暴力算就行了 其實沒必要算的正正好 為了方便的後面的計算 我們不考慮 i,j 的順序問題 也就是先求出 sum n sum n i neq j len i 然後對於每個字尾樹上的節點,減去一下貢獻 也就是 size i size i 1 len i len i.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 沒學好,找...