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 output2
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的蚯蚓。每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那乙隻,將其切成兩段。若有多隻最長的,則任...