給 P (≤10000) 個小寫單詞(長≤20),Q (≤100000) 次查詢,每次給一個串,問有多少個單詞包含它作為子串。
將每個單詞的所有子串插入字典樹,節點記錄 cnt(有多少不同單詞經過此節點)和 last(最後插入的單詞編號),避免同一單詞重複計數。
struct Trie {
int cnt, last;
Trie* next[26];
Trie(): cnt(0), last(0) { memset(next, 0, sizeof(next)); }
};
void insert(Trie* root, const char* s, int id) {
for (int i = 0; s[i]; ++i) {
Trie* p = root;
for (int j = i; s[j]; ++j) {
int c = s[j]-'a';
if (!p->next[c]) p->next[c] = new Trie();
p = p->next[c];
if (p->last != id) { p->last = id; ++p->cnt; }
}
}
}
int query(Trie* root, const char* s) {
Trie* p = root;
for (int i = 0; s[i]; ++i) {
int c = s[i]-'a';
if (!p->next[c]) return 0;
p = p->next[c];
}
return p->cnt;
}