字典树
struct Trie { static const int N = 5e5 + 5; static const int tot = 26; int tr[N][tot]; bool e[N]; int cnt = 0;
Trie() {
}
Trie(int n) { init(n); }
void init(int n) { for (int i = 0; i <= n; i++) { for (int j = 0; j < tot; j++) { tr[i][j] = 0; } e[i] = 0; } }
void add(string &s, char offset = 'a') { int p = 1; for (int i = 0; i < s.size(); i++) { int nex = s[i] - 'a'; if (!tr[p][nex]) tr[p][nex] = ++cnt; p = tr[p][nex]; } e[p] += 1; }
int query(string &s, char offset = 'a') { int p = 1; for (int i = 0; i < s.size(); i++) { int nex = s[i] - 'a'; if (tr[p][nex] == -1) return false; p = tr[p][nex]; } return e[p]; }};