bzoj 2434 Noi2011 阿狸的打字機

2021-08-01 14:24:48 字數 2470 閱讀 8007

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...