就一篇題解:
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 intview code#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
*/
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...