日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 2434 Luogu P2414 [NOI2011]阿狸的打字机 (AC自动机、树状数组)

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 2434 Luogu P2414 [NOI2011]阿狸的打字机 (AC自动机、树状数组) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接: https://www.lydsy.com/JudgeOnline/problem.php?id=2434

題解:

我寫的是離線做法,不知道有沒有在線做法。

轉化一波題意,\(x\)在AC自動機上代表的字符串在\(y\)代表的字符串中出現的次數等于\(x\)在fail樹的子樹內有多少個點是\(y\)點Trie樹上的祖先。

然后不難得到做法: 將詢問離線按照\(y\)在AC自動機上的id排序(一個正常的構建Trie的方式建出來應該就滿足節點的編號是它的Trie樹DFS序).

在Trie樹上DFS, 同時回答詢問, 用樹狀數組維護即可

代碼

#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std;const int N = 1e5; const int S = 26; struct Edge {int v,nxt; } e[(N<<1)+3]; struct Query {int x,y,id;bool operator <(const Query &arg) const{return y<arg.y;} } qr[N+3]; int fe[N+3]; int dfn[N+3]; int fa[N+3]; int son[N+3][S+3]; int fail[N+3]; char str[N+3]; int stk[N+3]; int id[N+3]; int que[N+3]; int bit[N+3]; int ord[N+3]; int ans[N+3]; int sz[N+3]; int n,q,siz,m,cnt,en;void addval(int lrb,int val) {while(lrb<=cnt){bit[lrb] += val;lrb += (lrb&(-lrb));} }int querysum(int rb) {int ret = 0;while(rb){ret += bit[rb];rb -= (rb&(-rb));}return ret; }void addedge(int u,int v) {en++; e[en].v = v;e[en].nxt = fe[u]; fe[u] = en; }void buildTrie() {int u = 0,tp = 0; stk[tp] = 0;for(int i=1; i<=n; i++){if(str[i]=='B'){stk[tp] = 0; tp--;u = stk[tp];}else if(str[i]=='P'){m++; id[m] = u;}else{str[i]-=96;if(!son[u][str[i]]) {siz++; son[u][str[i]] = siz;}u = son[u][str[i]];tp++; stk[tp] = u;}} }void buildACA() {int head = 1,tail = 0;for(int i=1; i<=S; i++) {if(son[0][i]) {tail++; que[tail] = son[0][i];} fail[son[0][i]] = 0;}while(head<=tail){int u = que[head]; head++;addedge(fail[u],u); addedge(u,fail[u]);for(int i=1; i<=S; i++){if(son[u][i]) {fail[son[u][i]] = son[fail[u]][i]; tail++; que[tail] = son[u][i];}else {son[u][i] = son[fail[u]][i];}}} }void dfs(int u) {cnt++; dfn[u] = cnt;sz[u] = 1;for(int i=fe[u]; i; i=e[i].nxt){if(e[i].v==fa[u]) continue;fa[e[i].v] = u;dfs(e[i].v);sz[u] += sz[e[i].v];} }int main() {scanf("%s",str+1); n = strlen(str+1);scanf("%d",&q);buildTrie();buildACA();for(int i=1; i<=q; i++){int x,y; scanf("%d%d",&x,&y);qr[i].x = id[x]; qr[i].y = id[y]; qr[i].id = i;}dfs(0);sort(qr+1,qr+q+1);int u = 0,tp = 0,j = 0; stk[tp] = 0; addval(dfn[u],0);for(int i=1; i<=n; i++){if(str[i]=='B'){addval(dfn[u],-1);stk[tp] = 0; tp--;u = stk[tp];}else if(str[i]=='P'){while(j<q && qr[j+1].y==u){j++;ans[qr[j].id] = querysum(dfn[qr[j].x]+sz[qr[j].x]-1)-querysum(dfn[qr[j].x]-1);}}else{u = son[u][str[i]];tp++; stk[tp] = u;addval(dfn[u],1);}}for(int i=1; i<=q; i++){printf("%d\n",ans[i]);}return 0; }

總結

以上是生活随笔為你收集整理的BZOJ 2434 Luogu P2414 [NOI2011]阿狸的打字机 (AC自动机、树状数组)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产在线青青草 | 日韩精品一区二区三区免费视频 | 天天做天天摸天天爽天天爱 | 99久久久国产精品无码性 | 青青草免费在线观看视频 | 中文字幕人妻色偷偷久久 | 国产大屁股喷水视频在线观看 | 亚洲第一福利网站 | 国产免费不卡视频 | 夜福利视频 | 国产最新自拍视频 | 人妻少妇偷人精品视频 | 欧美在线资源 | 国产一区在线不卡 | 亚洲综合日韩精品欧美综合区 | 欧美日韩一二区 | 亚洲天堂2021av| 超碰精品在线 | 尤物国产精品 | 日韩精品免费在线 | 久草精品在线观看视频 | 中文字幕亚洲视频 | 日日夜夜免费精品 | 97在线视频免费观看 | 影音先锋三级 | 成人午夜在线视频 | 亚洲国产高清在线 | 天天色综合图片 | 青青草香蕉 | a在线天堂 | 日韩三级在线 | 污版视频在线观看 | 91亚洲精品在线观看 | 精品日韩在线播放 | 成年人看片网站 | 国产激情久久久 | 99在线精品视频免费观看软件 | 国产成人久久精品77777综合 | 菲律宾黄色片 | 麻豆三级在线观看 | 黄色九九 | 乱淫的女高中暑假调教h | 黄色激情在线观看 | 国产精品电影在线观看 | 天天插夜夜爽 | www欧美 | 色99色| 国产福利视频一区二区 | 国产精品久久久久久一区二区 | 国产精品88av| 国产女主播在线 | 精品久久一区二区 | 亚洲一级片 | 91精选国产 | 超碰成人av | 天堂资源| 亚洲国产97 | 91亚洲精品久久久蜜桃借种 | 潘金莲裸体一级淫片视频 | 日韩不卡视频在线 | 在线观看免费av网站 | 黑丝av在线 | 奇米影视第4色 | cao国产| 中文在线免费视频 | 日日日人人人 | 中文字幕综合网 | 国产精品美女自拍视频 | av播放在线| 国产精品美女主播 | 青青草狠狠操 | 欧美精品一区在线观看 | 91麻豆影视 | 欧美福利网站 | 一边摸一边做爽的视频17国产 | 黄色一集片 | 韩国久久久久久 | 成人午夜激情视频 | 91亚洲精品久久久蜜桃网站 | 福利av在线 | 在哪里可以看毛片 | 久久人人爽爽 | 国产精品无码久久久久高潮 | 操亚洲 | 日日摸夜夜添狠狠添欧美 | 五月婷婷中文 | 99久久夜色精品国产亚洲 | 西比尔在线观看完整视频高清 | 女生的胸无遮挡 | 国产精品9191 | 黄色三级a | 黄页视频在线免费观看 | 日本欧美一区二区三区 | 成人精品在线观看 | 在线观看日韩一区 | 无码人妻丰满熟妇精品区 | 黑丝久久 | 亚洲第一二三区 | 欧美日韩精品综合 |