字典树
字典树(前缀树)
具体来说,Trie一般支持两个操作:
- insert(S):插入操作,就是将一个字符串 S 加入到集合中。
- search(S):查询操作,就是查询一个字符串 S 是不是在集合中。
int trie[maxn][26], tot; // 字典树 & 前缀树
int exist[maxn]; // 有多少字符串在此处结束
int num[maxn]; // 统计前缀个数
void insert(char s[]) { // 插入字典树
int pos = 0, n = strlen(s+1);
for(int i = 1; i <= n; ++ i) {
int j = s[i] - 'a';
if (trie[pos][j] == 0) {
trie[pos][j] = ++tot;
}
pos = trie[pos][j];
num[pos] ++; // 统计前缀个数
}
exist[pos] ++; // 标记终点
}
int search(char s[]) { // 查询相同前缀个数
int pos = 0, n = strlen(s+1);
for(int i = 1; i <= n; ++ i) {
int j = s[i] - 'a';
pos = trie[pos][j];
if (pos == 0) return 0; // 匹配失败
}
return num[pos];
}
字符串 文章被收录于专栏
关于acm竞赛字符串的个人笔记
顺丰集团工作强度 274人发布