Trie树
一种特殊的字典树,利用树的特性,实现字符串的快速查找,统计(记模板)
Trie字符串统计
维护一个字符串集合,支持两种操作:
-
I x
向集合中插入一个字符串 x; -
Q x
询问一个字符串在集合中出现了多少次。
共有 N 个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。
代码:
#include<bits/stdc++.h>
using namespace std;
int son[100005][26];//[每条子字符串的id][字母]
int cnt[100005],idx;
char str[100005];
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 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 n;cin>>n;
while(n--)
{
char c,s[100005];
cin>>c>>s;
if(c=='I')insert(s);
else cout<<query(s)<<endl;
}
}
二进制Tire树
在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?
代码:
#include<bits/stdc++.h>
using namespace std;
int son[4000005][2],idx;
int n;
void insert(int x)
{
int p=0;
for(int i=30;i>=0;i--)//从高位开始插入,高位先匹配
{
int u=x>>i&1;
if(!son[p][u])son[p][u]=++idx;
p=son[p][u];
}
}
int query(int x)
{
int p=0,res=0;
for(int i=30;i>=0;i--)
{
int u=x>>i&1;
if(son[p][!u])
{
p=son[p][!u];
res=res*2+!u;
}
else
{
p=son[p][u];
res=res*2+u;
}
}
return res;
}
int main()
{
cin>>n;int k,res,ans=0;
for(int i=0;i<n;i++)
{
cin>>k;
insert(k);
res=query(k);
ans=max(ans,res^k);
}
cout<<ans<<endl;
}