AC自動機理解

2021-08-30 15:35:29 字數 849 閱讀 4292

對於ac自動機可能有的疑問。

首先上**,該**使用char型陣列儲存,事實上string也完全可以。

#includeusing namespace std;

char s[1000005];

struct tree//字典樹

ac[1000000];//trie樹

int cnt=0;//trie的指標

inline void build(char* s)

ac[now].end+=1;//標記單詞結尾

}void get_fail()//構造fail指標

}while(!q.empty())//bfs求fail指標

else//不存在這個子節點

ac[u].vis[i]=ac[ac[u].fail].vis[i];

//當前節點的這個子節點指向當

//前節點fail指標的這個子節點 }}

}int ac_query(char* s)//ac自動機匹配

}return ans;

}int main()

ac[0].fail=0;//結束標誌

get_fail();//求出失配指標

scanf("%s",s+1);//文字串

cout<1、其實fail陣列fail[u]=v的意思就是根節點到v所表示的字串為從根節點到u所代表的字串的字尾。之所以這樣做是因為如果在u處失配,則v的前半部分也已配對好,只需接著配對即可。

2、 在構造fail陣列時,基於u(即當前子節點)的構造使人一開始十分疑惑。事實上,這樣的構造方式可以起到加速效果。而且畫圖有助於理解。(在樹中插入she和her,之後去匹配sher,十分清楚)。

先去吃飯。

AC自動機 建立nlogn個AC自動機

string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...

AC自動機及字尾自動機

ac自動機是一種基於trie樹的演算法,其本質和kmp上的處理很相似。trie樹結構 kmp轉移思路 ac自動機組要由三個部分組成 trie樹的建立 fail指標的匹配 對ac自動機的詢問 每次建立自動機會有一次初始化 ac自動機類 struct node node結構體 struct ac voi...

AC自動機演算法

ac自動機簡介 首先簡要介紹一下ac自動機 aho corasickautomation,該演算法在1975年產生於貝爾實驗室,是著名的多模匹配演算法之一。乙個常見的例子就是給出n個單詞,再給出一段包含m個字元的文章,讓你找出有多少個單詞在文章裡出現過。要搞懂ac自動機,先得有字典樹trie和kmp...