struct trie
{
int nex[500005][26],cnt=1;
int exist[500005];
trie()
{
cnt=1;
memset(nex,0,sizeof(nex));
memset(exist,0,sizeof(exist));
}
int idx(char c) {return c-'a';}
void insert(char *s)
{
int p=0,l=strlen(s+1);
for(int i=1;i<=l;i++)
{
int c=idx(s[i]);
if(!nex[p][c]) nex[p][c]=cnt++;
p=nex[p][c];
}
exist[p]=1;
}
int find(char *s)
{
int p=0,l=strlen(s+1);
for(int i=1;i<=l;i++)
{
int c=idx(s[i]);
if(!nex[p][c]) return 0;
p=nex[p][c];
}
return exist[p];
}
}tree;
总结:
注意一下trie树开空间的时候的一点问题。
trie树的关键就在可以在很多字符串里面搜索字符串
问题:
还未完成01-trie以及trie合并
最长异或路径
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int head[N],nnext[N],edge[N],ver[N];
int tot=1;
int ans=0;
void add(int x,int y,int e)
{
ver[++tot]=y,edge[tot]=e;
nnext[tot]=head[x],head[x]=tot;
}
struct trie
{
int nex[3000005][2],cnt=1;
int exist[3000005];
void insert(int x)
{
int p=0;
for(int i=30;i>=0;i--)
{
int c=(x>>i)&1;
if(!nex[p][c]) nex[p][c]=cnt++;
p=nex[p][c];
}
}
void find(int x)
{
int p=0,res=0;
for(int i=30;i>=0;i--)
{
int c=(x>>i)&1;
if(nex[p][c^1]) p=nex[p][c^1],res|=(1<<i);
else p=nex[p][c];
}
ans=max(ans,res);
}
}tree;
int dis[N];
void dfs(int x,int fa)
{
tree.insert(dis[x]);
tree.find(dis[x]);
for(int i=head[x];i;i=nnext[i])
{
int y=ver[i],e=edge[i];
if(y==fa) continue;
dis[y]=dis[x]^e;
dfs(y,x);
}
}
void solve()
{
int n;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dfs(1,0);
printf("%d",ans);
}
signed main()
{
int T=1;
for(int i=1;i<=T;i++)
{
solve();
}
return 0;
}