Trie树
Trie树
Trie树是一种用于存储字符串和查找字符串的高效数据结构,插入查找的时间复杂度均为\(O(n)\)
对于数组son[N] [x], N在模板中,表示所有字符串的总长度,等价于idx的最大值,假设有n个数,把每个数的二进制位存入Trie数后,N的最大值就为所有数字的二进制位数之和。而x则表示对于每个点的儿子结点的可能性最大值
idx的含义与在存图的邻接表中一样
son[i] [j] 存的是编号为i的结点的第j个孩子的编号
相当于通过trie树将所有字符串(包括子串)都连接起来了,每个子串都可以对应到一个结点编号。
代码示例:
//#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;
}
/*
*/

浙公网安备 33010602011771号