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 一眼望去,我選擇...