BJ模擬 String(SAM LCT 主席樹)

2021-08-18 13:41:33 字數 2924 閱讀 1758

傳送門

題意:

給字串

s s

,支援:

1.末尾加入字元。

2.查詢[l

,r]' role="presentation">[l,

r][l

,r]中出現兩次的最長字串。

題解:

好題。考慮離線做法:

動態插入後面的字元,更新前面

l l

的答案。

當我們插入乙個字元

r' role="presentation">r

r的時候,與前面的公共子串為它的字尾。 我們考慮暴力跳fa

ilf ai

l鏈來更新答案:

每個位置記last表示endpos的最後乙個位置,那麼這個位置能更新i−

len[

i]+1

i −l

en[i

]+

1往左的

l l

,以及i−

len[

i]+1

~i' role="presentation">i−l

en[i

]+1~

ii−l

en[i

]+1~

i的l。 其中第一部分的答案為le

n[i]

l en

[i

],第二部分則為le

n[i]

−(p−

(i−l

en[i

]+1)

) len

[i]−

(p−(

i−le

n[i]

+1))

tagt ag

即可。發現這個覆蓋過程就是lc

t lct

的access

a cc

es

s,那麼我們用lct來維護這個last即可。(均攤o(

nlogn)

o (n

log⁡n)

,想不到字串有這麼優美的性質)

#include 

#include

using

namespace

std;

typedef

long

long ll;

typedef pair pii;

typedef

unsigned

long

long ull;

const

int rlen=1

<<18|1;

inline

char nc()

inline

int rd()

while(isdigit(ch))

return i*f;

}inline

void w(int x)

if(x<0)

while(x)

while(buf[0])

}const

int n=2e5+50, inf=0x3f3f3f3f, lg=200;

int n;

namespace sgt

inline

void modify(int &y,int x,int l,int r,int l,int r,int v)

int mid=(l+r)>>1;

if(r<=mid) modify(lc[y],lc[x],l,mid,l,r,v);

else

if(l>mid) modify(rc[y],rc[x],mid+1,r,l,r,v);

else modify(lc[y],lc[x],l,mid,l,mid,v), modify(rc[y],rc[x],mid+1,r,mid+1,r,v-(mid+1-l));

}inline

void modifya(int &y,int x,int l,int r,int l,int r,int v)

int mid=(l+r)>>1;

if(r<=mid) modifya(lc[y],lc[x],l,mid,l,r,v);

else

if(l>mid) modifya(rc[y],rc[x],mid+1,r,l,r,v);

else modifya(lc[y],lc[x],l,mid,l,r,v), modifya(rc[y],rc[x],mid+1,r,l,r,v);

}inline

int ask(int x,int l,int r,int p)

inline

int ask(int l,int r)

}namespace lct

}pool[n];

inline

bool isroot(node *x)

inline

bool which(node *x)

inline

void rotate(node *x) else

}inline

void splay(int p) rotate(x);}}

inline

void link(int p,int q)

inline

void cut(int p,int q)

inline

void access(int &x,int p,int pos,int *len)

if(t->rc) t->rc->last=t->last;

t->rc=y; t->last=pos; }}

}namespace sam

}lct::access(sgt::rt[pos],p,pos,l);

lst=p;

}}char ch[n]; int len,type,la;

int main() else

}}

BJ模擬 期望(容斥)

題意 有n nn個變數x1n x n x1n 每個變數取值在 0,1 0,1 0,1 之間隨機,設s i 1 nxi s lfloor sum nx i rfloor s i 1n x i 求s ms m sm的期望 mo d998244353 pmod mod99 8244 353 題解 不妨設 ...

BJ模擬 帳篷 凸包

題目描述 解題思路 當n,m很小時,直接暴力列舉起點,用三角剖分的方式,狀態記錄當前點和上乙個點dp,複雜度為o n4 o n 4 當n,m較大時,h已經遠超1e9z,直接求周長最小凸包即可,注意周長最小時自動滿足凸性,所以可以只列舉起點,狀態記錄當前點dp即可,也可以用floyed求最小環的方式d...

BJ模擬 tree 樹形dp

題目描述 給一棵 n n 個節點的邊帶權樹,要求在樹上選出 k role presentation style position relative k k個點 a1 a2,aka 1,a2,a k,使得 k 1i 1dis ai,ai 1 i 1k 1 dis ai,a i 1 最小。1 k n 3...