內含字典樹建立及查詢模板
描述給定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 #include3 #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的非...