【problem】
bzoj2434
洛谷2414
codevs1946
【solution】
本著刷ac自動機去做的這題,而且這題一看就是要用資料結構的
這題大致題意是求a在b中出現的次數,聯想ac自動機
如果每次儲存一下列印出來的字串,陣列君會受不了的
首先考慮優化空間,構造ac
a
c自動機時只儲存每個串的結束位置,空間優化到了線性
再考慮時間,利用fa
ilf ai
l陣列,對於詢問
a a
在b' role="presentation">b
b中出現多少次,答案為在
a a
中所有節點中有多少通過fa
il' role="presentation">fai
lfai
l指標直接或間接可到
b b
的結尾節點
但如果每次暴力計算,時間會炸,所以考慮fa
il' role="presentation">fai
lfai
l樹,每次相當於求在以
b b
的結尾節點為根的子樹下有多少個
a' role="presentation">a
a節點,用上樹狀陣列差分維護即可,具體見**
【code】
#include
using
namespace
std;
#define lowbit(x) ((x)&(-(x)))
#define rg register
#define cl(x) memset(x,0,sizeof(x))
template
inline
void read(_tp&x)
const
int n=105000;
struct querye[n];
inline
void add(int,int);
inline
void a_log(int x,int delta)
inline
int q_log(int x)
queue
q;struct ac_auto
void build()
return ;
}void work()
}ac;
inline
void dfs(int x)
int main()
inline
void add(int u,int v)
題解 NOI2011 阿狸的打字機
阿狸的打字機 text 所以,我們可以對操作串進行模擬,並處理出每乙個串在樹上的位置。接下來,我們考慮如何處理詢問。y 是需要跑的串,於是我們應按照 y 排序以保證在處理這個 y 之前,它本身或者其他的東西沒有加進樹上過。考慮同樣的模板處理方法 對於乙個串出現了幾次,我只需要統計這個串結尾編號在 f...
NOI2011阿狸的打字機
阿狸喜歡收藏各種稀奇古怪的東西,最近他淘到一台老式的打字機。打字機上只有28個按鍵,分別印有26個小寫英文本母和 b p 兩個字母。經阿狸研究發現,這個打字機是這樣工作的 l 輸入小寫字母,打字機的乙個凹槽中會加入這個字母 這個字母加在凹槽的最後 l 按一下印有 b 的按鍵,打字機凹槽中最後乙個字母...
NOI2011 阿狸的打字機
阿狸喜歡收藏各種稀奇古怪的東西,最近他淘到一台老式的打字機。打字機上只有28個按鍵,分別印有 26個小寫英文本母和 b p 兩個字母。經阿狸研究發現,這個打字機是這樣工作的 輸入小寫字母,打字機的乙個凹槽中會加入這個字母 按 p 前凹槽中至少有乙個字母 按一下印有 b 的按鍵,打字機凹槽中最後乙個字...