Tire树(带图详解)

基本介绍

tire树又被称为字典树,是一种高效查找和储存的数据结构,tire树的两大功能插入和查找。

函数实现 

int son[N][26],cnt[N],idx;
//0既是空节点,又是根节点
//son[][]存储每个节点的子节点
//cnt[]存储以每个节点结尾的单词的数量
//idx表示当前要插入的节点是第几个,每创建一个节点值加一

//插入一个字符串
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指向下一个节点
    }
    cnt[p]++;     //记录以该节点结尾的字符串出现的次数
}

//查询字符串出现的次数
int queue(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];            返回答案
}

图解

 

 

例题 

AcWing 835. Trie字符串统计 

维护一个字符串集合,支持两种操作:

  1. I x 向集合中插入一个字符串 x;
  2. Q x 询问一个字符串在集合中出现了多少次。

共有 N 个操作,所有输入的字符串总长度不超过 105105,字符串仅包含小写英文字母。

输入格式

第一行包含整数 N,表示操作数。

接下来 N 行,每行包含一个操作指令,指令为 I x 或 Q x 中的一种。

输出格式

对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。

每个结果占一行。

数据范围

1≤N≤2∗104

输入样例:
5
I abc
Q abc
Q ab
I ab
Q ab
输出样例:
1
0
1

 代码实现

#include<iostream>
using namespace std;
const int N=100010;
int son[N][26],cnt[N],idx;
//son储存子节点的位置,分支最多26条
//cnt存储以某节点结尾的字符串个数
//idx表示当前插入的结点是第几个 
char str[N];

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];
	}
	cnt[p]++;
}

int queue(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;
			cin>>op>>str;
			if(op=='I')insert(str);
			else cout<<queue(str)<<endl;
		} 
	return 0;
} 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值