【AC自動機】【數據結構】【樹】【Aho-Corasick automation】AC自動機理解(入門)...

引入

我們首先提出一個問題:
給出n個串每個串的長度m
然后給出一個長度為k的串,詢問前n個串中有多少個是匹配成了的

暴力搜索

這題不是sb題目嗎?
隨隨便便O(kmn)跑過。
。。。。
n=10000 m=50
k=1000000
。。。。
好吧——我們用AC自動機吧

樣例

首先我們舉一個例子,我們有n=3個串he 和 her 和 she
然后我們通過構建Trie可以得到下圖
這里寫圖片描述
這里紅色的節點到根的路徑可以構成一個串(怎么那么像后綴自動機?)然后我們可以發現

正文

概念

我們使用Fail(i)表示i節點用虛線連接的邊,這樣的邊我們的作用就是當前節點到根的路徑構成的字符串的最長的存在的后綴的串的位置。比如she 和 he 中 he 就是 she 的最長的后綴所以我們連接 e2->e這樣我們假設從e2無法再繼續伸展的時候我們就可以O(1)找到類似的串,然后繼續進行伸展得到如下的圖
這里寫圖片描述
這樣比如我們匹配sher的時候我們首先沿著邊走到e2然后不需要重新搜索,而是選擇立即跳轉到e節點然后搜索到r節點

這樣我們就構造出了一個AC自動機的圖

構建方法

就使用上面的例子
這里寫圖片描述
對于這樣的一個圖,我們首先隊列中有

Queue01
hs

同時將深度為1的節點連接Fail到root
這里寫圖片描述
然后我們掃描一遍h節點可以得到e節點然后我們掃描s節點可以發現s的Fail邊上的root節點存在和s的兒子h相同的另一個h那么因為s的fail邊上的所有節點的后綴相同,所以我們有h2和h節點同時增加一個節點后仍然滿足上面的Fail邊的概念,所以我們h2->h得到
這里寫圖片描述
同時我們的隊列變成了

Queue01
2h2

對于下面的伸展我們可以得到(同理):
這里寫圖片描述
呵呵呵代碼時間:

代碼

void Insert(char *s){int len = strlen(s), u = root;for(int i=0;i<len;i++){int id = idx(s[i]);if(!pool[u].ch[id]) pool[u].ch[id] = ++ecnt;u = pool[u].ch[id];}pool[u].End_Flag++;
}
void build(){queue<int> que;for(int i=0;i<26;i++)if(pool[root].ch[i])que.push(pool[root].ch[i]);int u, v, t, p;while(!que.empty()){u = que.front();que.pop();for(int i=0;i<MAXK;i++) if(pool[u].ch[i]){v = pool[u].ch[i];que.push(v);p = pool[u].Fail;while(p && !pool[p].ch[i]) p = pool[p].Fail;t = pool[p].ch[i];pool[v].Fail = t;pool[v].last = pool[t].End_Flag ? t : pool[t].last;}}
}

感謝

感謝您閱讀這篇文章,如果有不足的地方請做出評論謝謝

轉載于:https://www.cnblogs.com/JeremyGJY/p/5921588.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396367.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396367.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396367.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

域控dns無法解析域控_域注冊商,DNS和托管

域控dns無法解析域控by ????? ??????????由??????????????? 域名注冊商&#xff0c;DNS和托管 (Domain registrars, DNS, and hosting) 如何正確設置網站 (How to set up your website the right way) It took me a while to set up the infras…

java 棧空間_初學JAVA——棧空間堆空間的理解

1.Person pangzi; //這是在“開拓空間”于棧空間pangzinew Person(); //這是賦值于堆空間上兩步就是在做與空間對應的事。2.值類型直接存入棧空間&#xff0c;如AF&#xff0c;引用類型存入堆空間&#xff0c;在棧空間存有“索引地址”&#xff0c;如當需要B時&#xff0…

二進制安裝kubernetes v1.11.2 (第八章 kube-apiserver 部署)

繼續上一章部署。 八、部署kube-apiserver組件 使用第七章的haproxy和keepalived部署的高可用集群提供的VIP&#xff1a;${MASTER_VIP} 8.1 下載二進制文件&#xff0c;參考 第三章  8.2 創建 kubernetes 證書和私鑰 source /opt/k8s/bin/environment.sh cat > kubernetes-…

element手機驗證格式_vue封裝 element-ui form表單驗證 正則匹配手機號 自定義校驗表格內容...

效果image.png在methods中//檢查手機號isCellPhone(val) {if (!/^1(3|4|5|6|7|8)\d{9}$/.test(val)) {return false;} else {return true;}}在template中v-model"forgetForm.phone"type"text"auto-complete"off"placeholder"請輸入你的手機…

multi-mechanize error: can not find test script: v_user.py問題

從github上下載&#xff0c;安裝multi-mechanize&#xff0c;新建工程&#xff0c;運行工程報錯。 環境&#xff1a; win7-x64, python 2.7 multi-mechanize can not find test script: v_user.py 查看了github上的工程&#xff0c;項目無人維護&#xff0c;這個問題2016年11月…

@RequestMapping 用法詳解之地址映射

引言&#xff1a; 前段時間項目中用到了RESTful模式來開發程序&#xff0c;但是當用POST、PUT模式提交數據時&#xff0c;發現服務器端接受不到提交的數據&#xff08;服務器端參數綁定 沒有加任何注解&#xff09;&#xff0c;查看了提交方式為application/json&#xff0c; 而…

我的第一個網頁 代碼_我在免費代碼營的第一個月

我的第一個網頁 代碼by Elliott McNary埃利奧特麥克納里(Elliott McNary) 我在免費代碼營的第一個月 (My First Month At Free Code Camp) I wanted to build an app that would help artists to make more money.我想開發一個可以幫助藝術家賺更多錢的應用。 I had a clear …

java pem rsa_如何從java中的pfx文件/ pem文件中獲取RSA公鑰的指數和模數值

I want to extract information about RSA Public Key from the pfx file using java.我有一個pfx文件并轉換為x509 Pem文件 . 從pem文件&#xff0c;在終端中使用以下命令&#xff1a;openssl x509 -in file.pem -text我能夠查看公鑰指數和模數值主題公鑰信息&#xff1a;Publ…

jmeter+maven+jenkins自動化接口測試(下)

mavenjmeter已經寫好了&#xff0c;可以通過maven來執行jmeter的接口測試腳本&#xff0c;怎樣實現定時執行測試并發送報告郵件就需要通過jenkins了&#xff08;jmeter或者testng也可以結合不同的郵件jar包來發送郵件&#xff0c;這里使用jenkins&#xff09; 安裝jenkins筆記有…

在使用angularjs過程,ng-repeat中track by的作用

轉載&#xff1a;http://segmentfault.com/q/1010000000405730<div ng-repeat"links in slides"> <div ng-repeat"link in links track by $index">link.name</div></div>Error: [ngRepeat:dupes]這個出錯提示具體到題主的情況…

java判斷讀到末尾_IO流如何判斷讀取到了流的結尾,程序中以-1來判斷,是流中寫入一個EOF表示流結束嗎,底層實現呢?...

-1不是流中寫入的數據。read()方法返回的數據都是unsigned byte&#xff0c;即是[0,255]。底層實現有很多&#xff0c;比如socket IO和文件IO&#xff0c;甚至你自己也可以實現。——————————————————————給兩個類的代碼給你看看&#xff0c;理解一下這個東…

結束書

by William Countiss威廉Countiss 結束書 (Closing the Book on Closures) JavaScript closures are an important, but notoriously confusing concept. There’s no escaping it — if you want to grow as a developer, you need to understand what closures are and how …

java激勵_激勵干個人java的不足之處

1.你需要精通面向對象分析與設計(OOA/OOD)、涉及模式(GOF&#xff0c;J2EEDP)以及綜合模式。你應該十分了解UML&#xff0c;尤其是class&#xff0c;object&#xff0c;interaction以及statediagrams。2.你需要學習JAVA語言的基礎知識以及它的核心類庫(collections&#xff0c;…

Bioconductor軟件安裝與升級

1 安裝工具Bioc的軟件包不能使用直接install.packages函數&#xff0c;它有自己的安裝工具&#xff0c;使用下面的代碼&#xff1a; source("https://bioconductor.org/biocLite.R")biocLite() 上面第二個語句將安裝Bioconductor一些基礎軟件包&#xff0c;包括BiocI…

Laravel Kernel引導流程分析

Laravel Kernel引導流程分析 代碼展示 protected function sendRequestThroughRouter($request) {# $this->app->instance(request, $request);# Facade::clearResolvedInstance(request);// 主要是這句代碼$this->bootstrap();# return (new Pipeline($this->app)…

Android RecyclerView (一) 使用完全解析

轉載請標明出處&#xff1a; http://blog.csdn.net/lmj623565791/article/details/45059587&#xff1b; 本文出自:【張鴻洋的博客】 概述 RecyclerView出現已經有一段時間了&#xff0c;相信大家肯定不陌生了&#xff0c;大家可以通過導入support-v7對其進行使用。 據官方的…

數據透視表日期怎么選范圍_透視范圍

數據透視表日期怎么選范圍by Tiffany White蒂芙尼懷特(Tiffany White) 透視范圍 (Putting Scope in Perspective) In JavaScript, lexical scope deals with where your variables are defined, and how they will be accessible — or not accessible — to the rest of your…

feign調用多個服務_Spring Cloud 快速入門系列之feign–微服務之間的調用

我們將一個大的應用拆成多個小的服務之后&#xff0c;緊接著的一個問題就是&#xff0c;原本都在一個項目里&#xff0c;方法我可以隨便調用&#xff0c;但是拆開后&#xff0c;原來的方法就沒法直接調用了&#xff0c;這時候要怎么辦&#xff1f;Spring Cloud提供了feign&…

Asix下日志包沖突

為什么80%的碼農都做不了架構師&#xff1f;>>> Class org.apache.commons.logging.impl.SLF4JLogFactory does not implement org.apache.commons.logging. 最近集成asix包的時候發生如下錯誤&#xff0c;原因是程序運行時logFactoryImple加載了JBOSS下面的sff4j包…

kubernetes中mysql亂碼_在kubernetes中部署tomcat與mysql集群-Go語言中文社區

在kubernetes中部署tomcat與mysql集群之前必須要有以下這些基礎&#xff1a;1. 已安裝、配置kubernetes2. 集群中有tomcat與mysql容器鏡像3. 有docker基礎具體步驟部署tomcat創建tomcat RC對象我們想要在kubernetes集群中配置tomcat服務器&#xff0c;首先要保證集群中的節點上…