前言: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不算是一种算法,只是一种储存结构,用空间换时间的一种做法,所以并没有过多的变换题型。