Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串)。
优点:最大限度地减少无谓的字符串比较,查询效率比哈希表高。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
输入字符串,在每个字符串的结尾做标记,当输入字符串为:"abc"时,c处无标记,则该该字符串集中不存在"abc"。
例题:
835. Trie字符串统计 - AcWing题库https://www.acwing.com/problem/content/description/837/数组定义:
int son[N][26],cnt[N],idx;
char str[N];
/*
对每个字符串的结尾做标记
son表示每个结点最多向外伸出26条边
cnt表示以当前单词为结尾的字符串有多少个
idx表示当前用到的编号(下标为0的点为根结点)
*/
插入:
void insert(char str[]){
int p=0;//根结点
//对字符串进行遍历 到当前字符串结尾时则停止
for(int i=0;str[i];i++){
int u=str[i]-'a';//得到当前结点的编号进行插入
//当结点还不存在时 则创建新的结点
if(!son[p][u]) son[p][u]=++idx;
p=son[p][u];//插入成功或者当结点存在时 指针p暂存当前编号idx
}
cnt[p]++;//以该结点为结尾的数量增加
}
查询:
int query(char *str)
{
int p = 0;
for(int i = 0; str[i]; i++)
{
int u = str[i] - 'a';
if(!son[p][u]) return 0; //该节点不存在,即该字符串不存在
p = son[p][u];
}
return cnt[p]; //返回字符串出现的次数
}
主函数:
int main()
{
int m;
cin >> m;
while(m--)
{
char op[2];
scanf("%s%s", op, str);
if(*op == 'I') insert(str);
else printf("%d\n", query(str));
}
return 0;
}