1. 程式人生 > >[知識點]Trie樹和AC自動機

[知識點]Trie樹和AC自動機

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 #define MAXM 1000005
 5 
 6 int T, n, tot, q[MAXM], ls, l, r;
 7 char s[55], ch[MAXM];
 8 
 9 struct Tree {
10     int a[26], x, f;
11 } t[MAXM];
12 
13 void insert() {
14     int o = r;
15     for (int i = 0; i < ls; i++) {
16
int x = s[i] - 'a'; 17 if (!t[o].a[x]) t[o].a[x] = ++tot; 18 o = t[o].a[x]; 19 } 20 t[o].x++; 21 } 22 23 void getf() { 24 int head = 1, tail = 2; 25 q[1] = r; 26 while (head != tail) { 27 int o = q[head]; 28 for (int i = 0; i <= 25
; i++) { 29 int v = t[o].a[i]; 30 if (!v) continue; 31 if (o == r) t[v].f = r; 32 else { 33 int of = t[o].f; 34 while (of) { 35 if (t[of].a[i]) { 36 t[v].f = t[of].a[i];
37 break; 38 } 39 of = t[of].f; 40 } 41 if (!of) t[v].f = r; 42 } 43 q[tail++] = v; 44 } 45 head++; 46 } 47 } 48 49 int find() { 50 int ans = 0, x = r; 51 for (int i = 0; i < l; i++) { 52 int o = ch[i] - 'a'; 53 while (!t[x].a[o] && x != r) x = t[x].f; 54 x = t[x].a[o] ? t[x].a[o] : r; 55 int y = x; 56 while (t[y].x) ans += t[y].x, t[y].x = 0, y = t[y].f; 57 } 58 return ans; 59 } 60 61 int main() { 62 scanf("%d", &T); 63 for (int i = 1; i <= T; i++) { 64 scanf("%d", &n), r = ++tot; 65 for (int j = 1; j <= n; j++) scanf("%s", s), ls = strlen(s), insert(); 66 getf(); 67 for (int j = r + 1; j <= tot; j++) if (!t[j].f) t[j].f = r; 68 scanf("%s", ch), l = strlen(ch); 69 printf("%d\n", find()); 70 } 71 return 0; 72 }

相關推薦

[知識點]TrieAC自動機

1 #include <cstdio> 2 #include <cstring> 3 4 #define MAXM 1000005 5 6 int T, n, tot, q[MAXM], ls, l, r; 7 char s[55], ch[MAXM]

hihocoder 1036 Trie圖(AC自動機

script 字符串 das reset 再計算 const 傳送門 什麽 聯網 傳送門 Description 上回說到,小Hi和小Ho接受到了河蟹先生偉大而光榮的任務:河蟹先生將要給與他們一篇從互聯網上收集來的文章,和一本厚厚的河蟹詞典,而他們要做的是判斷這篇文

LA_3942 LA_4670 從字典AC自動機

while 原理 strlen sca lld 方式 下午 -- mod 首先看第一題,一道DP+字典樹的題目,具體中文題意和題解見訓練指南209頁。 初看這題模型還很難想,看過藍書提示之後發現,這實際上是一個標準DP題目:通過數組來儲存後綴節點的出現次數。也就是用一顆字典

AC自動機】【字符串】【字典AC自動機 學習筆記

none ring mem ems 如何 top 暴力 繼續 編號 blog:www.wjyyy.top AC自動機是一種毒瘤的方便的多模式串匹配算法。基於字典樹,用到了類似KMP的思維。 AC自動機與KMP不同的是,AC自動機可以同時匹配多個模式串,而

【python 走進NLP】兩種高效過濾敏感詞演算法--DFA演算法AC自動機演算法

一道bat面試題:快速替換10億條標題中的5萬個敏感詞,有哪些解決思路? 有十億個標題,存在一個檔案中,一行一個標題。有5萬個敏感詞,存在另一個檔案。寫一個程式過濾掉所有標題中的所有敏感詞,儲存到另一個檔案中。 1、DFA過濾敏感詞演算法 在實現文字過濾的演算法中,DFA是

hihoCoder Trie圖(AC自動機

原來AC自動機是Trie圖啊。。。 Trie圖與KMP的作用相似,都是求字串匹配,而且感覺求法也是類似,不過KMP是單個模式串求匹配,Trie圖是多個模式串求匹配,為了實現這個功能,Tire圖多了一個字首指標,類似KMP的失配陣列 首先按照Tire樹建立好一個

Trie圖(AC自動機)階段做題小結

AC自動機構建完成後,某個節點沿著Fail鏈向上能從長到短走到自己的所有後綴。一般的,遍歷主串進行匹配,就是在Trie圖上定向移動的過程。 構造(一遍 BFS) 1 void build_AC() 2 { 3 int u=0; 4 for(int i=0;i&l

bzoj4231 回憶AC自動機+fail+KMP(+狀陣列))

bzoj4231 回憶樹 題意: 回憶樹是樹。 具體來說,是n個點n-1條邊的無向連通圖,點標號為1~n,每條邊上有一個字元(出於簡化目的,我們認為只有小寫字母)。 對一棵回憶樹來說,回憶當然是少不了的。 一次回憶是這樣的:你想起過往,觸及心底…唔

Trie字尾講解及應用

     在pongba的討論組上看到一道Amazon的面試題:找出給定字串裡的最長迴文。例子:輸入XMADAMYX。則輸出MADAM。這道題的流行解法是用字尾樹(Suffix Tree)。這坨資料結構最酷的地方是用它能高效解決一大票複雜的字串程式設計問題:  1.在文

AC自動機1——適用於utf-8編碼的Trie

最近需要用到文字的拼音相似度計算,看了hankcs大神的hanlp裡面通過ac自動機實現拼音的儲存,想把它轉成python版本的。開始啃AC自動機吧。 AC自動機建立在Trie樹和KMP字串匹配演算法。首先啃Trie樹。 我所要做的是把utf-8編碼的中文詞和拼音對應起來

【bzoj3281】最大異或 可持久化Trie

log pac 序列 str char s pan pri scan bool 題目描述 給定一個非負整數序列 {a},初始長度為 N。 有M個操作,有以下兩種操作類型:1、A x:添加操作,表示在序列末尾添加一個數 x,序列的長度 N+1。2、Q l r x

trie查找hash查找比較(大量數據)

stdlib.h emp lib ras eno strlen oid ack std trie樹代碼 #include<iostream> #include<stdio.h> #include<iostream> #include&l

[POJ 1204]Word Puzzles(Trie暴搜&amp;AC自己主動機)

cloc produce cte owin you dsm queue pos cti Description Word puzzles are usually simple and very entertaining for all ages. They are

AC自動機 & fail

求一個 -a tex 深度 text 多少 上下 node 直接 [BZOJ 1195] 最短母串   題意   給定 n (n <= 12) 個子串 s (|s| <= 60) , 求一個最短母串.   分析   建 AC 自動機.   設 St 為每個點的狀

【bzoj3881】[Coci2015]Divljak AC自動機+鏈的並+DFS序+狀數組

Go using %d 字符串表 rdquo alice microsoft fail 需要 題目描述 Alice有n個字符串S_1,S_2...S_n,Bob有一個字符串集合T,一開始集合是空的。 接下來會發生q個操作,操作有兩種形式: “1 P&rdq

【BZOJ】2434: [Noi2011]阿貍的打字機 AC自動機+狀數組+DFS序

log 字符串 html 有趣的 http .com dfs 個性 blog 【題意】阿貍喜歡收藏各種稀奇古怪的東西,最近他淘到一臺老式的打字機。打字機上只有28個按鍵,分別印有26個小寫英文字母和‘B‘、‘P‘兩個字母。 經阿貍研究發現,這個打字機是這樣工作的: l 輸入

BZOJ2434[Noi2011]阿貍的打字機——AC自動機+dfs序+狀數組

IE memset 換行 收藏 就是 namespace fail樹 src 輸入 題目描述 阿貍喜歡收藏各種稀奇古怪的東西,最近他淘到一臺老式的打字機。打字機上只有28個按鍵,分別印有26個小寫英文字母和‘B‘、‘P‘兩個字母。經阿貍研究發現,這個打字機是這樣工作

CodeForces 547E:Mike and Friends(AC自動機+DFS序+主席

src father ast bsp each In ant 如何 PE What-The-Fatherland is a strange country! All phone numbers there are strings consisting of lowercas

Nikitosh 異或 —— 一道 trie 的題用可持久化 trie 水 然後翻車了...

普通 就是 ... str strong 記錄 clas 自己 相加 題意簡介 題目就是叫你找兩個不重合的非空區間,使得這兩個區間裏的數異或後相加的和最大 (看到異或,沒錯就決定是你了可持久化trie!) 思路 水一波字典樹,莫名覺得這題可持久化能過,於是水了一發掛

洛谷P3966 [TJOI2013]單詞 單詞 (ac自動機 fail的應用)

emp c++ lse class 是我 文章 amp 就是 http 目錄 洛谷P3966 [TJOI2013]單詞 單詞 (ac自動機 fail樹的應用) 概述: 參考代碼 洛谷P3966 [TJOI2013]單詞 單詞 (ac自動機 fail樹的應用) 題目鏈接