NCSTOJ 1421 字首統計 Trie

2021-08-29 05:37:14 字數 1255 閱讀 8852

[字典樹模版題] 給定n個字串s1,s2…sn,接下來進行m次詢問,每次詢問給定乙個字串t,求s1~sn中有多少個字串是t的字首。輸入字串的總長度不超過10^6,僅包含小寫字母。字串 s1(不妨假設長度為 n)被稱為字串 s2 的字首,當且僅當:s2 的長度不小於 n,且 s1 與 s2 前 n 個字元組組成的字串完全相同。

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

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

3 2

abbc

abcabc

efg

2

0

把這n個字串插入一顆trie樹中,trie的每個節點上儲存乙個整數cnt,記錄該節點是多少個字串的末尾節點。(為了處理插入重複字串的情況,這裡要記錄個數,而不能只做結尾標記)

對於每個詢問,在trie樹中檢索t,在檢索過程中累加途徑的每個節點的cnt值,就是該詢問的答案。

關於trie樹:本題需要插入和檢索的字串都由小寫字母構成,所以trie每個節點具有26個字元指標分別為a到z。

在trie樹中,字元資料都體現在樹的邊(指標)上,樹的節點僅儲存一些額外資訊,例如單詞結尾標記等。其空間複雜度為o(nc),其中n是節點個數,c是字符集的大小。

#include

#include

#include

#include

using

namespace std;

const

int size=

1000010

;// trie每個節點記錄cnt, 根節點為1

int trie[size][26

], cnt =1;

// 存在重複字串

int edtot[size]

;int n, m;

char str[size]

;// 向trie中插入乙個字串

void

insert

(char

* str)

edtot[p]++;

}int

search

(char

* str)

return ans;

}int

main()

for(

int i=

1;i<=m;i++

)}

NCSTOJ 仰視奶牛

t 仰視奶牛 time limit 1 sec memory limit 128 mib back submit edit description 約翰有n頭奶牛,編號為1到n。現在這n頭奶牛按編號從小到大的順序站成了一排,其中奶牛 i 的身高為hi。現在,每頭奶牛都向它的右側望向那些編號較大的奶牛...

NCSTOJ 1473 陣列的度

示例 1 輸入 1,2,2,3,1 輸出 2 解釋 輸入陣列的度是2,因為元素1和2的出現頻數最大,均為2.連續子陣列裡面擁有相同度的有如下所示 1,2,2,3,1 1,2,2,3 2,2,3,1 1,2,2 2,2,3 2,2 最短連續子陣列 2,2 的長度為2,所以返回2.input 第一行乙個...

142 猴子報數

猴子報數 n個猴子圍坐一圈並按照順時針方向從1到n編號,從第s個猴子開始進行1到m的報數,報數到第m的猴子退出報數,從緊挨它的下乙個猴子重新開始1到m的報數,如此進行下去知道所有的猴子都退出為止。求給出這n個猴子的退出的順序表。輸入有做組測試資料 每一組資料有兩行,第一行輸入n 表示猴子的總數最多為...