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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

AC自动机解决字符集很大的情况(可持久化数组优化getfail的过程)

發布時間:2024/4/11 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AC自动机解决字符集很大的情况(可持久化数组优化getfail的过程) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天遇到了一個問題,那就是如果 ACACAC 自動機的字符集很大該怎么辦?比如改成 1e51e51e5 該怎么辦呢?

例如下題:

題目來源轉自(侵權刪):點擊查看

先不考慮解法,肯定是需要用 ACACAC 自動機去解決的,但是問題是,本題中字符串的總長度可能達到 O(n2)O(n^2)O(n2) 級別,加上字符集特別大,所以遇到了很多問題

不過不難看出題目中給出的實際上就是一棵 trietrietrie 樹,我們可以直接在 trietrietrie 樹上 getfailgetfailgetfail,就可以構建出 ACACAC 自動機了,現在的問題轉換為,如何處理字符集很大的情況

先看普通的 getfailgetfailgetfail 的模板:

void getfail() {queue<int>q;for(int i=0;i<26;i++){if(trie[0][i]){fail[trie[0][i]]=0;q.push(trie[0][i]);}}while(!q.empty()){int cur=q.front();q.pop();for(int i=0;i<26;i++){if(trie[cur][i]){fail[trie[cur][i]]=trie[fail[cur]][i];q.push(trie[cur][i]);}elsetrie[cur][i]=trie[fail[cur]][i];}} }

簡單的思路肯定是直接把 262626 改成 1e51e51e5,很可惜這樣顯然是會 TLETLETLE

考慮 bfsbfsbfs 轉移的瓶頸出現在哪里呢?通過分析后不難看出實際上就是上面代碼第 242424 行的

trie[cur][i]=trie[fail[cur]][i];

的這句代碼,轉移了太多無用的狀態。對于每一層的轉移,實際上只有很少的情況進入到了 ififif 語句里

所以假設,我們開一個 unordered_map<int,int>trans[N]unordered\_map<int,int>trans[N]unordered_map<int,int>trans[N] 用于儲存題目中給出的字典樹,其中 trans[u][to]=vtrans[u][to]=vtrans[u][to]=v 表示在字典樹中從點 uuu 經過一條權值為 tototo 的邊可以到達點 vvv。再開一個 unordered_map<int,int>trie[N]unordered\_map<int,int>trie[N]unordered_map<int,int>trie[N] 用于儲存 getfailgetfailgetfail 的轉移過程,則將上述代碼改進一下:

void getfail() {queue<int>q;for(auto it:trans[0]){int u=0,v=it.second,to=it.first;trie[u][to]=v;fail[v]=u;q.push(v);}while(!q.empty()){int u=q.front();q.pop();trie[u]=trie[fail[u]];for(auto it:trans[u]){int v=it.second,to=it.first;trie[u][to]=v;fail[trie[u][to]]=trie[fail[u]][to];q.push(trie[cur][to]);}} }

如此一來,干脆把 if?elseif-elseif?else 分支直接刪除掉了。不過又出現了新的問題,如何快速執行第 151515 行的賦值操作呢?

這里就要引入可持久化數組了,所謂可持久化數組,就是可以訪問歷史版本的,支持單點更新和單點查詢的主席樹

如此一來就完美解決了這個模型

代碼:

const int N=1e6+100; const int M=1e5; unordered_map<int,int>trans[N]; struct Node {int l,r,val; }tree[N]; int trie[N],fail[N],tot; int newnode() {tot++;tree[tot].l=tree[tot].r=tree[tot].val=0;return tot; } void add(int &k,int pos,int val,int l,int r) {int nk=newnode();tree[nk]=tree[k];k=nk;if(l==r) {tree[k].val+=val;return;}int mid=(l+r)>>1;if(pos<=mid) {add(tree[k].l,pos,val,l,mid);} else {add(tree[k].r,pos,val,mid+1,r);} } int ask(int k,int pos,int l,int r) {if(l==r) {return tree[k].val;}int mid=(l+r)>>1;if(pos<=mid) {return ask(tree[k].l,pos,l,mid);} else {return ask(tree[k].r,pos,mid+1,r);} } void getfail() {queue<int>q;for(auto it:trans[0]) {int u=0,v=it.second,to=it.first;add(trie[u],to,v,1,M);fail[v]=u;q.push(v);}while(q.size()) {int u=q.front();q.pop();trie[u]=trie[fail[u]];for(auto it:trans[u]) {int v=it.second,to=it.first;int delta=v-ask(trie[u],to,1,M);add(trie[u],to,delta,1,M);fail[v]=ask(trie[fail[u]],to,1,M);q.push(v);}} } void init() {tot=-1;newnode(); }

總結

以上是生活随笔為你收集整理的AC自动机解决字符集很大的情况(可持久化数组优化getfail的过程)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产男女网站 | 日韩精品福利在线 | 一本色道久久综合亚洲精品图片 | 亚洲自拍p | 丝袜诱惑一区 | 久久免费资源 | 久久在草 | 亚洲激情免费 | 国产精品久久久久久久久久妞妞 | 91丝袜美女| 女性私密整形视频 | 欧美在线视频不卡 | 女人一级一片30分 | 日本少妇在线 | 欧美性猛交ⅹxx乱大交 | 午夜在线免费观看视频 | 亚洲区综合 | 亚洲图区综合 | 色噜噜视频| 天天夜夜骑 | 极品美妇后花庭翘臀娇吟小说 | 成人午夜网站 | 青草视频在线播放 | 国产欧美一区二区三区在线看蜜臀 | 久久99精品久久久久久琪琪 | 大学生三级中国dvd 日韩欧美一区二区区 | 国产最爽的乱淫视频国语对白 | 天天操狠狠操 | 欧美一区二区三区免费在线观看 | 韩国理论午夜 | 国产精品嫩草影院精东 | 亚洲xx视频| 欧美日韩在线播放视频 | 亚洲精品鲁一鲁一区二区三区 | 国产成人超碰人人澡人人澡 | 免费在线观看视频 | 亚洲中文字幕无码不卡电影 | 狠狠老司机 | 亚洲一区二区三区四区五区六区 | 一本黄色片| 婷婷人体| 国模精品视频 | 日日天天干 | 男女午夜视频在线观看 | 激情视频久久 | 鬼灭之刃柱训练篇在线观看 | 高清三区 | av有声小说一区二区三区 | 欧美又大粗又爽又黄大片视频 | 日本护士做爰视频 | 黄色三级在线视频 | 黄色污污视频软件 | 一级黄色大片视频 | 五月天伊人网 | 亚洲精品天堂成人片av在线播放 | 一本一道无码中文字幕精品热 | 微拍福利一区二区 | 在线啪| 姐姐的秘密韩剧免费观看全集中文 | 蜜臀99久久精品久久久久小说 | 骚虎视频在线观看 | julia在线播放88mav | 欧洲精品久久久久毛片完整版 | 色啊色| av在线亚洲天堂 | 丁香综合网 | 欧美人与性动交g欧美精器 国产在线视频91 | va视频在线 | 叼嘿视频在线免费观看 | 91午夜交换视频 | 狠狠狠狠狠狠狠干 | 无码人妻精品一区二区蜜桃网站 | 天天干夜夜操视频 | 波多野吉衣在线视频 | 国产精品国产三级国产aⅴ下载 | 51人人看 | 视频福利在线观看 | 五月婷婷狠狠干 | 日本涩涩网站 | 亚洲精品白浆高清久久久久久 | 99热香蕉 | 久久久久久久久久成人 | 美女扒开尿口给男人桶 | 人成免费在线视频 | 精品福利在线观看 | 图片区小说区视频区 | 亚洲影院一区二区三区 | 六月丁香色婷婷 | 国产精品专区在线观看 | 国产伦精品一区二区三区精品 | 欧美精品一区二区三区三州 | 日韩激情在线观看 | 欧美日韩午夜精品 | 欧美巨大另类极品videosbest | 人妻熟女一区二区三区 | 一级特黄bbbbb免费观看 | 中文字幕9 | 亚洲网址在线观看 | 又黄又爽的视频在线观看 |