Trie树
Trie树
Trie树是一种用于存储字符串和查找字符串的高效数据结构,插入查找的时间复杂度均为\(O(n)\)
对于数组son[N] [x], N在模板中,表示所有字符串的总长度,等价于idx的最大值,假设有n个数,把每个数的二进制位存入Trie数后,N的最大值就为所有数字的二进制位数之和。而x则表示对于每个点的儿子结点的可能性最大值
idx的含义与在存图的邻接表中一样
835. Trie字符串统计 - AcWing题库
代码示例:
//#pragma comment(linker, "/STACK:10240000000000,10240000000000")
//#pragma GCC optimize(2)
#include
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 vii;
typedef vector vll;
typedef long long ll;
typedef unsigned long long ull;
typedef pair pii;
typedef pair 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;
}
/*
*/