題解 NOI2011阿狸的打字機

2021-08-15 09:35:14 字數 1322 閱讀 9094

【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 的按鍵,打字機凹槽中最後乙個字...