noip2019集訓測試賽(一)B 字串

2021-09-25 22:29:47 字數 1684 閱讀 5010

upd:本題字符集為全體小寫字母

這題我寫了乙個查詢前暴力get_fail的,複雜度**,但資料水,過了

時間複雜度:o(mlogm)

前序遍歷fail樹,得到dfn,就可以愉快地維護樹狀陣列查詢答案了~

關於fail樹可以看看這裡:

tips:把查詢的s也插入ac自動機其實對解題沒有影響,因為最後統計的實際是每個操作1和操作2對某段區間的貢獻,即某段區間的點代表的字串都包含該串。

但是實際上出題人的意思是通過二進位制分組,建立log

mlogm

logm

個ac自動機,使用類似啟發式合併的方法將size相同的ac自動機合併,這樣每個字串最多被插入log

mlogm

logm

次,時間複雜度o(mlogm)。(想想就覺得不會打麻煩)

給的是某位ak比賽的學長的**,rp++

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

2000005

;int m,l,tot=

1,len[n]

,bg[n]

,fail[n]

,num[n]

,ch[n][26

];int cnt,idx,nt,head[n]

,to[n]

,nxt[n]

,dfn[n]

,siz[n]

,ck[n]

;ll c[n]

,mask,ans,val[n]

,op[n]

;char s[n]

,str[n]

;void

adde

(int u,

int v)

void

insert

(char s,

int id)

k=ch[k]

[x];

} num[id]

=k;}

void

build()

else}}

for(

int i=

2;i<=tot;i++)}

void

dfs(

int u)

}void

add(

int i,

int v)

}ll query

(int i)

return res;

}voidgo(

int l,

int r)

else}}

intmain()

}build()

;dfs(1

);for(

int i=

1;i<=m;i++

)else

if(op[i]==2

)else

}return0;

}

2019集訓總結

見知識點list 有些東西還是沒有想透,以及學習演算法很多流於表面而沒有仔細去想一想本質的東西,一做題就不會一看題解就拍腦門.jpg 對著乙個點鑽研這個精神我不要臉地承認說是好的,不過弊端是見得不夠多,所以視野不夠廣闊,思維就容易受侷限 仲爺有一句話我覺得很對,剛學乙個演算法的時候遇到乙個題沒有什麼...

6 28集訓 集訓模擬賽2

第一題 n只有4,直接暴力 第二題 tarjan縮點之後跑乙個最長路 第三題 dp 第四題 思維量較大 n 的範圍很小,所以我們考慮狀壓dp 我們設 f i j k m 為第一行的狀態為 i 第二行的狀態為 j 第三行的狀態為 k 第四題的狀態為 m 所需要的最小步數 所以我們暴力列舉6重迴圈,時間...

NOIP 10 28集訓總結

今天總算有題目會做了 概述 拿到題目,細細讀題,t1,t2都有頭緒。t3一頭悶什麼都不知道 t1 想了想,觀察到p是質數,所以每個數必定存在逆元,嗯,然後就走遠了。因為想著是2個2個數組合,所以想不到正解。其實什麼數都湊得出來,只要你想,因為必定有原根。打了暴力,耗時1h左右 t2 一眼望去,我選擇...