voidin(string s){ int p = 0, n = s.size(); rep(i, 0, n - 1){ int x = s[i] - '0'; if(!trie[p][x]) trie[p][x] = ++ cnt; // 如果该节点没有连接s[i],那么新增结点编号 p = trie[p][x]; // 下传结点 ans[p] ++; //以该结点结尾的字符串个数 } }
于是我们便可以便捷地查询有s前缀字符串的个数
1 2 3 4 5 6 7 8 9
intget(string s){ int p = 0, n = s.size(); rep(i, 0, n - 1){ int x = s[i] - '0'; if(!trie[p][x]) return0; //还没找完就没有了,直接 return 0 p = trie[p][x]; } return ans[p]; // }