P2414 NOI2011 阿狸的打字機

2022-05-20 20:30:29 字數 1554 閱讀 6379

p2414 [noi2011]阿狸的打字機

顯然跟處理字串有關,但具體用什麼呢?

一次列印有可能會列印之前重複過的,當然是\(trie\),之後查詢作為子串出現過幾次,看看前面的\(trie\),當然用\(trie\)圖了

先考慮暴力,\(y\)所在串的每個字元跳\(fail\)是否能到\(x\)的末尾

在\(parents\)樹尤拉序找區間,每個查詢\((x,y)\),\(x\)丟到\(y\)節點去

最後在跑一遍\(trie\),每個節點的尤拉序遞迴開始加到樹狀陣列裡,然後對這個節點裡的查詢處理(查詢\(x\)的\(end\)區間的值,此時裡面剩的值都是\(y\)的貢獻)

結束再把該點從樹狀陣列踢出來

#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const ll maxn=1e5+9;

inline ll read()

while(c>='0'&&c<='9')

x=(x<<3)+(x<<1)+c-'0',c=getchar();

return x*f;

}ll t,nod=0;

ll son[maxn][26],tmp[maxn][26],ans[maxn],fail[maxn],fa[maxn],nd[maxn];

struct qyq[maxn];

inline bool cmp(qy x,qy y) }}

struct nodedis[maxn];

ll num,tot,head[maxn],dfn[maxn],low[maxn];

inline void add(ll u,ll v),head[u]=num;

}void xu(ll u)

struct tree;

ll sum[maxn];

vectorbelong[maxn];

inline ll lowbit(ll x)

inline void modify(ll i,ll val)

inline ll query(ll i)

void dfs(ll u)else if(c=='b')

now=fa[now];

else

nd[++cnt]=now;

} get_fail();

for(ll i=1;i<=nod;++i)

add(fail[i],i);

xu(0);

t=read();

for(ll i=1;i<=t;++i);

} sort(q+1,q+1+t,cmp);

for(ll i=1,pos=1;i<=t;i=pos)),

++pos;

} dfs(0);

for(ll i=1;i<=t;++i)

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

return 0;

}/*aaapbpbpap

1 3 2

*/

P2414 NOI2011 阿狸的打字機

打字機上只有28個按鍵,分別印有26個小寫英文本母和 b p 兩個字母。經阿狸研究發現,這個打字機是這樣工作的 輸入小寫字母,打字機的乙個凹槽中會加入這個字母 這個字母加在凹槽的最後 按一下印有 b 的按鍵,打字機凹槽中最後乙個字母會消失。按一下印有 p 的按鍵,打字機會在紙上列印出凹槽中現有的所有...

P2414 NOI2011 阿狸的打字機

傳送門 先想想暴力怎麼搞 搞乙個ac自動機 對每個詢問 x,y 把 y 暴力向下匹配 每個點都暴力跳fail 看看x出現了幾次 稍微優化一波 因為有多組詢問 考慮離線 可以把同一組的 y 一起來計算 還是把 y 暴力匹配 看看所有的x 出現了幾次 再來一波優化 考慮什麼時候 x 的出現次數會增加 顯...

NOI2011 JZOJ2784 阿狸的打字機

有乙個快取槽,設計乙個程式維護下面三個操作 i nser tc 在快取槽末尾插入小寫字元c pri nt 將快取所有字元連線輸出為字串 d elet e 刪除快取槽最後乙個字元 操作總共有 n 個。在所有操作結束之後,要支援 m個詢問。每個詢問都是查詢第 x 次輸出的字串在第 y次輸出的字串中出現了...