CH601字尾陣列 Trie樹

2022-06-26 03:33:09 字數 1632 閱讀 9795

內含字典樹建立及查詢模板

描述給定n個字串s1,s2...sn,接下來進行m次詢問,每次詢問給定乙個字串t,求s1~sn中有多少個字串是t的字首。輸入字串的總長度不超過10^6,僅包含小寫字母。

輸入格式

第一行兩個整數n,m。接下來n行每行乙個字串si。接下來m行每行乙個字串表示詢問。

輸出格式

對於每個詢問,輸出乙個整數表示答案

樣例輸入

3 2

abbc

abcabc

efg

樣例輸出
2

0

思路:

用scanf !=eof最後一組不知道為什麼就是會re

虐狗寶典字典樹筆記:

trie樹,字典樹每個節點擁有若干個字元指標,在插入或檢索字串時掃到乙個字元c就沿著當前節點的c字元指標走下去。

初始時,空trie僅包含乙個根節點,字元指標均為空。

插入s時,我們令乙個指標p指向根節點,依次掃瞄s中的每乙個字元c。

1.若p的c字元指標指向乙個已經存在的節點q,則令p=q

2.若p的c字元指標指向空,則新建乙個節點q,令p的c字元指標指向q,然後令p=q

當s掃瞄完畢,當前節點p上標記他是乙個字串的末尾

檢索s是否在trie中存在,令乙個指標p指向根節點,依次掃瞄s中的每個字元c

1.若p的c字元指標指向空,則說明s沒有被插入過trie,結束檢索

2.若p的c字元指標指向乙個已經存在的節點q,則令p=q

當s中的字元掃瞄完畢,若當前節點p被標記為乙個字串的末尾,說明s在trie中存在。

本題與講解的不同之處在於末尾應標記出現的次數,檢索時也應該同時統計所經過節點的作為末尾的次數。

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7 #include 8

using

namespace

std;

9 typedef long

long

ll;10

#define inf 0x7f7f7f7f

1112

intn, m;

13const

int maxn = 1e6 + 10;14

int trie[maxn][26], tot = 1

, ed[maxn];

15char

s[maxn];

1617

void insertt(char *str)

1825 p =trie[p][ch];26}

27 ed[p]++;28}

2930

int searchh(char*str)

3140

//ans += ed[p];

41return

ans;42}

4344

intmain()

4552

for(int j = 1; j <= m; j++)

56return0;

57 }

Trie上的字尾陣列

亦稱為廣義字尾陣列 lcs longest common suffix lcp longest common preffix sv s v表示trie上節點v到根的路徑形成的字串 由於在trie上,自帶去重功能 顯然l cs s u,sv de plca u,v lcs su,sv depl ca ...

trie上構建字尾陣列

往事太多,有時候忘了就忘了吧。如果有非記不可的,就只能用點附加手段啦 我們定義一棵往事樹是乙個 n 個點 n 1 條邊的有向無環圖,點編號為 1到 n,其中 1 號點被稱為是根結點,除根結點以外,每個點都恰有一條出邊 即以其作為起點的邊 每條邊上有 1 個字元 這裡我們實際上用乙個不大於 300的非...

trie上構建字尾陣列

往事太多,有時候忘了就忘了吧。如果有非記不可的,就只能用點附加手段啦 我們定義一棵往事樹是乙個 n 個點 n 1 條邊的有向無環圖,點編號為 1到 n,其中 1 號點被稱為是根結點,除根結點以外,每個點都恰有一條出邊 即以其作為起點的邊 每條邊上有 1 個字元 這裡我們實際上用乙個不大於 300的非...