阿狸喜歡收藏各種稀奇古怪的東西,最近他淘到一台老式的打字機。打字機上只有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分做法 讀入的時侯可以優化一下...