演算法競賽高階指南 字首統計 Trie

2021-09-19 07:53:45 字數 1241 閱讀 1479

description

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

字串 s1(不妨假設長度為 n)被稱為字串 s2 的字首,當且僅當:s2 的長度不小於 n,且 s1 與 s2 前 n 個字元組組成的字串完全相同。

input

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

output

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

sample input

3 2

abbc

abcabc

efg

sample output
2

0

trie插入

當需要插入乙個字串s時,我們令乙個指標p起始指向根節點。然後,依次掃瞄s中的每個字元c:

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

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

當s中的字元掃瞄完畢時,在當前節點p上標記它是乙個字串的結尾。 檢索

當需要檢索乙個字串s在trie中是否存在時,我們令乙個指標p起初指向根節點,然後依次掃瞄s中的每個字元c:

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

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

當s中的字元掃瞄完畢時,若當前節點p被標記為乙個字串的結尾,則說明s在trie中存在,否則說明s沒有被插入過trie。

#include

#include

using namespace std;

const

int maxn =

1000010

;int trie[maxn][26

];int cnt[maxn]

;char str[maxn]

;int n, m, idx;

void

insert()

cnt[p]++;

}int

query()

return sum;

}int

main()

for(

int i =

0; i < m; i ++

)return0;

}

題解 《演算法競賽高階指南》 字首統計

題目描述 給定n個字串s s s s1 s2 sn 接下來進行m次詢問,每次詢問給定乙個字串t,求s1 sn 中有多少個字串是t的字首。輸入字串的總長度不超過10 6 僅包含小寫字母。輸入描述 第一行兩個整數n,m。接下來n行每行乙個字串si。接下來m行每行乙個字串表示詢問。輸出描述 對於每個詢問,...

《演算法競賽高階指南》 防曬

有c頭奶牛進行日光浴,第i頭奶牛需要minspf i 到maxspf i 單位強度之間的陽光。每頭奶牛在日光浴前必須塗防曬霜,防曬霜有l種,塗上第i種之後,身體接收到的陽光強度就會穩定為spf i 第i種防曬霜有cover i 瓶。求最多可以滿足多少頭奶牛進行日光浴。輸入格式 第一行輸入整數c和l。...

《演算法競賽高階指南》蚯蚓

蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。蛐蛐國裡現在共有 n 只蚯蚓,第 i 只蚯蚓的長度為 ai 所有蚯蚓的長度都是非負整數,即可能存在長度為0的蚯蚓。每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那乙隻,將其切成兩段。若有多隻最長的,則任...