Trie(前缀树)用来保存字符串集合
这个树的根结点编号为0,其余结点编号为1开始的正整数
ch[i][j]表示结点i的边为j的子结点的编号(不存在则为0),当字符集为全体小写字母时,j的范围sigma_max=26
struct Trie {
int ch[maxnode][sigma_size];
int val[maxnode];
int sz;
Trie() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); }
int idx(char c) { return c - 'a'; }
void insert(char *s, int v) {
int u = 0, n = strlen(s);
for(int i = 0; i < n; i++) {
int c = idx(s[i]);
if(!ch[u][c]) {
memset(ch[sz], 0, sizeof(ch[sz]));
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = v;
}
bool query(char *s) {
int u = 0, n = strlen(s);
for(int i = 0; i < n; i++) {
int c = idx(s[i]);
if(!ch[u][c]) return false;
u = ch[u][c];
}
return val[u];
}
};