前言:trie树结构虽是以空间换时间的一种结构,但它利用数据之间的共同前缀特性,,eg abaab,aba可以共用前缀aba,节省了许多空间,因此在空间和时间的平衡上,有着较大的优势。
一.给定一串字符串,给出一些词,询问词是否重复,出现次数||某些前缀的问题.....
代码:2580
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000100;
int tot=0;
int ch[maxn][30];
bool b[maxn],b1[maxn];
string s;
int n,m;
void insert(string s)
{
int u=0;
int l=s.size();
for(int i=0;i<l;i++)
{
int c=s[i]-'a';
if(!ch[u][c]) ch[u][c]=++tot;
u=ch[u][c];
}
b[u]=1;
}
void find(string s)
{
int l=s.size();
int u=0;
for(int i=0;i<l;i++)
{
int c=s[i]-'a';
if(!ch[u][c]) {cout<<"WRONG"<<endl;return ;}
u=ch[u][c];
}
if(!b[u]) cout<<"WRONG"<<endl;
else if(b1[u]) cout<<"REPEAT"<<endl;
else
{
b1[u]=1;
cout<<"OK"<<endl;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s;
insert(s);
}
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>s;
find(s);
}
return 0;
}
二.01Trie:给定一棵树/图,求一个点到另一个点的路径权值的异或最大值
4551
#include<bits/stdc++.h>
#define maxn 1000010
using namespace std;
int head[maxn],va[maxn],nxt[maxn],to[maxn],ch[maxn][4],dis[maxn];
int res,tot,cnt;
void add(int u,int v,int w)
{
tot++;
nxt[tot]=head[u];
to[tot]=v;
va[tot]=w;
head[u]=tot;
}
void dfs(int u,int fa)
{
for(int i=head[u];i;i=nxt[i])
{
int y=to[i];
int z=va[i];
if(y==fa) continue ;
dis[y]=dis[u]^z;
dfs(y,u);
}
}
void insert(int x)
{
int u=0;
for(int i=30;i>=0;i--)
{
int t=(x>>i)&1;
if(!ch[u][t]) ch[u][t]=++cnt;
u=ch[u][t];
}
}
void find(int x)
{
int u=0;
int ans=0;
for(int i=30;i>=0;i--)
{
int t=(x>>i)&1;
if(ch[u][t^1])
{
u=ch[u][t^1];
ans+=(1<<i);
}
else u=ch[u][t];
}
res=max(res,ans);
}
int main()
{
int n;
cin>>n;
for(int i=1;i<n;i++)
{
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
dis[1]=0;
dfs(1,0);
for(int i=1;i<=n;i++) insert(dis[i]);
for(int i=1;i<=n;i++) find(dis[i]);
cout<<res;
return 0;
}
简单说明:x^x=0;
所以我们先求出每个点到原点的权值和x1,x2,则x1^x2即为1到2的权值和,再将一串二进制数当成字符串用trie树保存,从上至下每次取反,贪心求解。
总结:
TRIE不算是一种算法,只是一种储存结构,用空间换时间的一种做法,所以并没有过多的变换题型。