time limit: 10 sec
memory limit: 256 mb
submit: 3139
solved: 1731 [
submit][
status][
discuss]
阿狸喜歡收藏各種稀奇古怪的東西,最近他淘到一台老式的打字機。打字機上只有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
trie
【分析】
ac自動機+fail樹+dfs序+樹狀陣列
這題寫起來很吃力啊...
首先根據這個題的奇葩性質,我們線性掃一遍構建出來了乙隻trie,然後用last[i]表示第i個串在trie上的末尾節點...
看這個問題...問的是第x個串在第y個串中的出現次數。
建好了trie樹,列舉y串在trie上的每乙個節點,如果某節點的fail跳著跳著跳到了last[x],那麼答案+1,因為某個節點x的fail代表的串是x代表串的乙隻字尾。所以就是要求在fail樹中last[x]的子樹裡有多少個點是屬於y串的。
子樹問題...於是
機智的出題人想到了dfs序,這樣我們就可以用乙個區間 st[x],end[x]來表示x的子樹辣。
我們把詢問用鄰接表處理一下,對於詢問每個y串中x1,x2,x3...串出現的次數,我們可以先把y串中的字元的發現時間戳(st陣列)扔進樹狀陣列裡,然後對於x1,x2,x3用樹狀陣列統計一下 st[x],end[x]區間中出現數字的個數就好辣。qaq不過寫起來好累
(可能是我比較菜吧)
哦對了...根據奇葩性質,我們在處理完y串處理y+1串的時候可以在trie樹上倒著刪點...這樣時間複雜度就可以保證了qaq。
語文太差了qaq...聽不懂就去看 popoqqq的題解吧...講的挺棒。
【**】
//bzoj 打字機
#include#include#include#include#define ll long long
#define m(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=100005;
queue q;
char s[mxn],t[mxn];
int n,m,t,len,now,cnt,num,tim,tot;
int pre[mxn],head[mxn],pos[mxn];
int st[mxn],end[mxn],ans[mxn],last[mxn];
struct bit
inline void add(int x,int v)
inline int getsum(int x)
}b;struct interesting
f[mxn];
void add(int u,int v,int id)
}e,a;
struct node a[mxn];
inline void build() }}
inline void dfs(int u)
int main()
} build();
dfs(0);
scanf("%d",&m);
fo(i,1,m)
int k=1;now=0;
fo(u,1,tot)
k++;
for(j=a.head[u];j;j=a.f[j].next)
}fo(i,1,m) printf("%d\n",ans[i]);
return 0;
}
BZOJ2434 NOI2011 阿狸的打字機
發現一種新的思路,以前從來沒有見過的,即ac自動機的fail樹。這一題我們先考慮暴力,從root往y的最後乙個點走,如果走到了x的末點,ans 如果通過fail指標走到了x的末點,ans 反過來考慮,從x的末點開始,如果當前點在y串或者通過反向的fail到了y串,ans 又發把fail反向之後得到的...
bzoj2434 Noi2011 阿狸的打字機
傳送門 description 阿狸喜歡收藏各種稀奇古怪的東西,最近他淘到一台老式的打字機。打字機上只有28個按鍵,分別印有26個小寫英文本母和 b p 兩個字母。經阿狸研究發現,這個打字機是這樣工作的 l 輸入小寫字母,打字機的乙個凹槽中會加入這個字母 這個字母加在凹槽的最後 l 按一下印有 b ...
BZOJ2434 NOI2011 阿狸的打字機
bzoj 洛谷我們先想一下最暴力是怎麼搞的 把 ac 自動機建好,每乙個節點,從 y 串的結尾節點往上跳它的父親,和普通的 ac 自動機一樣跳就好了 然而這個可以優化一下 我們將所有詢問離線 每個串統計一次其他串對它的貢獻 就可以有 70pts 了 70pts include include inc...