NOI2011阿狸的打字機

2021-07-27 12:55:59 字數 2258 閱讀 6129

阿狸喜歡收藏各種稀奇古怪的東西,最近他淘到一台老式的打字機。打字機上只有28個按鍵,分別印有26個小寫英文本母和』b』、』p』兩個字母。

經阿狸研究發現,這個打字機是這樣工作的:

l 輸入小寫字母,打字機的乙個凹槽中會加入這個字母(這個字母加在凹槽的最後)。

l 按一下印有』b』的按鍵,打字機凹槽中最後乙個字母會消失。

l 按一下印有』p』的按鍵,打字機會在紙上列印出凹槽中現有的所有字母並換行,但凹槽中的字母不會消失。

例如,阿狸輸入apapbbp,紙上被列印的字元如下:aaa

ab我們把紙上列印出來的字串從1開始順序編號,一直到n。打字機有乙個非常有趣的功能,在打字機中暗藏乙個帶數字的小鍵盤,在小鍵盤上輸入兩個數(x,y)(其中1≤x,y≤n),打字機會顯示第x個列印的字串在第y個列印的字串中出現了多少次。

阿狸發現了這個功能以後很興奮,他想寫個程式完成同樣的功能,你能幫助他麼?

輸入的第一行包含乙個字串,按阿狸的輸入順序給出所有阿狸輸入的字元。

第二行包含乙個整數m,表示詢問個數。

接下來m行描述所有由小鍵盤輸入的詢問。其中第i行包含兩個整數x, y,表示第i個詢問為(x, y)。

輸出m行,其中第i行包含乙個整數,表示第i個詢問的答案。

apapbbp

31 2

1 32 321

01<=n<=10^5

1<=m<=10^5

輸入總長<=10^5

首先構建ac自動機的fail樹

得出dfs序,得出每個結點進出時間l[x],r[x],考慮這樣一種暴力

對於乙個詢問x,y,查詢自動機上root-y的每乙個結點,沿著fail指標是否會走到x的結尾點

如果可以即答案+1

而在fail樹中,變為查詢自動機上root-y的所有結點中,有多少個在x的子樹中?

(x子樹中的節點必然有乙個字尾=x)

只要在自動機上再重新走一遍,走到乙個結點y,則將1-l[y]都+1,解決詢問x,y(把y相同的鍊錶串起來),即查詢l[x]到r[x]的和。。。當遇到乙個b時1-l[y]都-1

樹狀陣列實現加減和區間求和

#include

#include

#include

#include

#include

using namespace std;

const int maxn=100010;

int trie[maxn][30]=;

int fail[maxn]=;

int fa[maxn]=;

int ans[maxn];

int l[maxn],r[maxn];

int pos[maxn];

int num[maxn<<1];

struct edgee[maxn];

struct nodea[maxn];

int head[maxn]=;

int head[maxn]=;

string s;

int sz=0,tot=0;

int len;

int now=0;

int cnt=0;

int ccnt=0;

inline int idx(char c)

inline void addedge(int f,int t)

inline void addedge(int f,int t)

inline void ac()

else trie[now][i]=trie[fail[now]][i];}}

}int ind=0;

inline void dfs(int x)

r[x]=++ind;

}inline int lowbit(int k)

inline void add(int k,int k1)

}inline int sum(int k)

return sum;

}inline void solve()

else if(s[i]=='b')

else}}

}int main()

}ac();

for(int i=1;i<=sz;i++)

addedge(fail[i],i);

dfs(0);

int x,y;

for(int i=1;i<=n;i++)

solve();

for(int i=1;i<=n;i++)

printf("%d\n",ans[i]);

return 0;

}

NOI2011 阿狸的打字機

阿狸喜歡收藏各種稀奇古怪的東西,最近他淘到一台老式的打字機。打字機上只有28個按鍵,分別印有 26個小寫英文本母和 b p 兩個字母。經阿狸研究發現,這個打字機是這樣工作的 輸入小寫字母,打字機的乙個凹槽中會加入這個字母 按 p 前凹槽中至少有乙個字母 按一下印有 b 的按鍵,打字機凹槽中最後乙個字...

NOI2011阿狸的打字機

剛學完字串演算法做一做題,這道題的質量的確很高,做完以後感覺對ac自動機有長進 一下的神仙思路來自yyb dalao 蒟蒻開始只想到了40分暴力,全程靠題解 step1 首先直接處理出所有的串再裸kmp好寫,但是覺得得分應該不高,也沒有人說能拿多少分 這個題正解的第一步是要想到ac自動機,準確地說和...

NOI2011 阿狸的打字機

調了下午到晚上 從0 40 70 100 心力交瘁 40分做法 直接在fail樹上暴力跳,修改節點值,樹狀陣列查詢時間複雜度n 2log 70分做法 接近正解,離線詢問,在對應的位置打標記,dfs的時候可以遍歷到這個點的時候,對這個點所有的詢問都可以同時處理出來 100分做法 讀入的時侯可以優化一下...