bzoj3467 Crash和陶陶的遊戲

2022-02-05 03:55:11 字數 2468 閱讀 4037

就一篇題解:

1.離線,建出atrie樹;b樹的倍增雜湊陣列,節點按照到根路徑字典序排序

2.處理a節點對應字首對應b中的極長可以匹配的區間。在父親節點區間內二分即可

3.更新答案:

①加入a點,找區間中b中已經出現點個數。樹狀陣列

②加入b點,本質是b到根的字串放在trie最大匹配長度,二分,雜湊表存a樹是否有這個字首,得到的長度就是當前匹配長度。

直上直下的鏈本質是字串的字首字尾。

動態更新hash很難,就離線,在可能貢獻的集合內找到當前出現的。

假裝有**.jpg

這個是兩個logn的

可以變成乙個logn!

sort是不必要的,

對於②b樹點對trie的影響,不妨直接倍增+hash找到最長的匹配位置y,在y的位置++,然後①時候子樹查詢即可!

通過提前打好標記使得不用同時考慮很多!

(類似預處理)

還有可能乙個點有多個c兒子,要合併成乙個。①的時候整個子樹++,表示到根的路徑上多了乙個點,②的時候,匹配最長位置單點查詢這個值

兩個樹狀陣列

注意,unsigned long long雜湊

單模數隨便rand就卡掉了

#include#define reg register int

#define il inline

#define fi first

#define se second

#define mk(a,b) make_pair(a,b)

#define numb (ch^'0')

#define ul unsigned long long

#define ll unsigned long long

using

namespace

std;

il void rd(int &x)

template

il void output(t x)

template

il void ot(t x)

template

il void prt(t a,int st,int nd)

namespace

miracle

intquery(ll h)

return -1

; }

}ha;

//trie

int ch[n][26

];int id[n];//

isint

n;int

tot;

intlp;

ul pw[(

1<<17)+233

];void ins(int x,int

c) id[lp]=++tot;

ch[x][c]=tot;

}int

dfn[n],df,dfn2[n];

void fin(int x,ul haxi,int

d)

for(reg i=0;i<26;++i)

}dfn2[x]=df;}//

b tree

intcur;

struct

nodee[

2*n];

inthd[n],cnt;

void add(int x,int y,int

z)int fa[n][18

];ul hsh[n][

18];

void dfs(intx)}

//question

struct

queq[n];

intget(int

x) }

return

ret;

}struct

treearray

int query(int

x)}t1,t2;

intmain()else

//cout

//cout

);//

cout<

prt(id,1,lp);

pw[0]=1

;

for(reg i=1;i<=(1

<<17);++i)

for(reg j=1;j<=17;++j)

}//cout<

);//

cout<

//cout<

prt(dfn,1,tot);

//cout<

prt(dfn2,1,tot);

int tc=0,tb=0

;

for(reg i=1;i<=n;++i)

else

++ans;

}printf(

"%lld\n

",ans);

}return0;

}}signed main()

/*author: *miracle*

date: 2019/3/26 18:56:24

*/

view code

BZOJ2158 Crash的旅行計畫

好久沒寫樹剖 線段樹各種維護的題了,這題調了我整整一天。膜sp y大佬 首先對於 n 1000 的資料,可以直接對於每乙個詢問暴力遍歷整棵樹,複雜度o n2 而對於一條鏈的情況,我們只需要用一棵線段樹 儲存每個區間的lm x rm x su m 即可 對於區間 l r 來說lm x ma x rm ...

BZOJ2159 Crash 的文明世界

這篇寫差分表和斯特林數介紹的不錯 這題就是要計算這個東西 s i j 1n dist i,j ks i j 1nd ist i,j k這個東西很難維護,我們把di st i j k d is t i,j k拆一下s u v kj 0d u,v d u,v j s u v j 0 kd u v d u...

bzoj 2159 Crash 的文明世界

又來做了一次。之前寫得實在是太差了,這次寫好點吧。這裡介紹用斯特林數展開的方法 如果不會的可以先看看這裡 我們知道xn k 0 ns n k k c x,k x n sum ns n,k k c x,k xn k 0n s n,k k c x k 因此,如果想知道答案,其實就是要知道對於每乙個k k...