Trie树

Trie树

Trie树是一种用于存储字符串和查找字符串的高效数据结构,插入查找的时间复杂度均为\(O(n)\)

对于数组son[N] [x], N在模板中,表示所有字符串的总长度,等价于idx的最大值,假设有n个数,把每个数的二进制位存入Trie数后,N的最大值就为所有数字的二进制位数之和。而x则表示对于每个点的儿子结点的可能性最大值

idx的含义与在存图的邻接表中一样
son[i] [j] 存的是编号为i的结点的第j个孩子的编号

相当于通过trie树将所有字符串(包括子串)都连接起来了,每个子串都可以对应到一个结点编号。

835. Trie字符串统计 - AcWing题库

代码示例:

//#pragma comment(linker,   "/STACK:10240000000000,10240000000000")
//#pragma GCC optimize(2)

#include <bits/stdc++.h>
using namespace std;

#define For(i,a,b) for (int i=(a);i<=(b);++i)
#define Fod(i,b,a) for (int i=(b);i>=(a);--i)
#define mls multiset
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define pob pop_back
#define itt iterator
#define endl '\n'
#define IOS ios::sync_with_stdio(0); cin.tie(0);
#define lowbit(x) x & (-x)
#define clr(x) memset(x, 0, sizeof(x));
#define fi first
#define se second

typedef vector<int> vii;
typedef vector<long long> vll;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
		
const int MAXN = 0x7fffffff;
const int MOD = 1000000007;
const ll MOD1 = 212370440130137957ll;

const int N = 20005;
int son[N][28], idx;
int cnt[N];
char str[N];
int 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 quire(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 ()
{	
	IOS;
	cin >> n;
	for(int i = 1; i <= n; i ++)
	{
		char op[3];
		cin >> op >> str;
		if(op[0] == 'I')
		{
			insert(str);
		}
		else cout << quire(str) << endl;
	}
	return 0;
}	
/*

*/
posted @ 2021-11-25 18:47  Yra  阅读(52)  评论(0)    收藏  举报