首页 > 其他分享 >字符串练习2 最长抑或路径(01trie树)

字符串练习2 最长抑或路径(01trie树)

时间:2022-11-20 10:05:28浏览次数:83  
标签:val 抑或 int MAX 01trie zt str ans 字符串

题目链接在这里:​​P4551 最长异或路径 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)​

是一道比较经典的问题,对于异或问题经常会使用01trie树来解决。

当然01trie树只是用来统计答案,往往还需要一些预处理操作。

比如此题需要把从当前点到根节点的路径的异或和求出来,讨论与根节点的联系在树的问题中很常见。

1 #include "bits/stdc++.h"
2 using namespace std;
3 const int MAX=1e6+5;
4 int n;
5 int tot,head[MAX],adj[MAX],nxt[MAX],wei[MAX];
6 int val[MAX];
7 void addedge(int u,int v,int w){
8 tot++;
9 adj[tot]=v;
10 wei[tot]=w;
11 nxt[tot]=head[u];
12 head[u]=tot;
13 }
14 void dfs(int x,int fa){
15 int i,j;
16 for (i=head[x];i;i=nxt[i]){
17 if (adj[i]==fa) continue;
18 val[adj[i]]=val[x]^wei[i];
19 dfs(adj[i],x);
20 }
21 }
22 struct Str{
23 int str[MAX][2],cnt;
24 bool vis[MAX];
25 Str(){
26 memset(str,0,sizeof(str));
27 cnt=0;
28 memset(vis,false,sizeof(vis));
29 }
30 void insert(int x){
31 int i,j,p=0;
32 bool zt;
33 for (i=30;i>=0;i--){
34 zt=(1<<i)&x;
35 if (str[p][zt]==0){
36 str[p][zt]=++cnt;
37 p=cnt;
38 }
39 else p=str[p][zt];
40 }
41 vis[p]=true;
42 }
43 int check(int v){
44 int i,j,p=0,ans=0;
45 bool zt;
46 for (i=30;i>=0;i--){
47 zt=v&(1<<i);
48 if (str[p][!zt]){
49 ans+=(1<<i);
50 p=str[p][!zt];
51 }
52 else p=str[p][zt];
53 // cout<<p<<endl;
54 }
55 // cout<<v<<' '<<ans<<endl;
56 return ans;
57 }
58 }ss;
59 int main(){
60 int i,j,u,v,w,ans=0;
61 scanf("%d",&n);
62 memset(head,0,sizeof(head));
63 memset(val,0,sizeof(val));
64 for (i=1;i<n;i++){
65 scanf("%d%d%d",&u,&v,&w);
66 addedge(u,v,w);
67 addedge(v,u,w);
68 }
69 dfs(1,0);
70 // for (i=1;i<=n;i++)
71 // cout<<i<<" : "<<val[i]<<endl;
72 for (i=1;i<=n;i++)
73 ss.insert(val[i]);
74 for (i=1;i<=n;i++)
75 ans=max(ans,ss.check(val[i]));
76 printf("%d\n",ans);
77 return 0;
78 }

 

标签:val,抑或,int,MAX,01trie,zt,str,ans,字符串
From: https://blog.51cto.com/u_15793969/5871251

相关文章

  • 字符串练习1 于是他错误的点名开始了(Trie)
    题目链接在这里:​​P2580于是他错误的点名开始了-洛谷|计算机科学教育新生态(luogu.com.cn)​​是一道trie树的板子题,注意理解trie树的每一个节点代表的是一个状态,这......
  • T292219 [传智杯 #5 练习赛] 复读 ----- 字符串
    给定若干个字符串,不定数量,每行一个。有些字符串可能出现了多次。如果读入一个字符串后,发现这个字符串以前被读入过,则这个字符串被称为前面相同的字符串的复读,这个字符串被......
  • Hive学习笔记:字符串拼接
    工作中需要合并区号与号码,因两个字段均为数值,无法直接使用“+”进行拼接,需要通过其他方法。一、concat拼接concat将多个字段(字段类型可不相同)拼接起来。使用语法为:-......
  • C# 字符串转二进制 十进制转二进制 十六进制转二进制 补位
    最近项目的协议需要根据传过来的十六进制字符串转换成二进制来判断设备状态。例如:"00"=>00表示设备1关、设备2关“01”=>01表示设备1关、设备2开“02”=>10表......
  • 【C语言进阶】三.字符串函数
    (一)字符串函数1.strlen(计算字符串元素数)(1)用法size_tstrlen(constchar*str)字符串已经'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包......
  • python3-基础篇-10-字符串
      字符串操作在​​python3-基础篇-04-字符串格式化输出(%、format())​​中已经提到了一些,在本章中将列举字符串的其它操作。1.字符串重复输出‘值’*num   (num为重复......
  • 反转字符串中的单词 同构字符串 验证回文串
    151.反转字符串中的单词s=s.trim();先清除前后空格String[]sb=s.split("");StringBuilderans=newStringBuilder();for(inti=sb.length-1;i>0;i--)......
  • sed 替换字符串和ip ([a-z]+) [0-9.]+
    [root@k8s-master01~]#cataa1.txtaaaabbbcccjfdjkasdfghjzxcvbqwertyuiophelloword[root@k8s-master01~]#sed-nr's#he(.*)rd#\1#gp'aa1.txtllowo[root@k......
  • vba解析JSON字符串
    vba解析JSON字符串vba解析JSON大概有4种方法1、htmlfile对象解析json(支持32位和64位系统)思路:创建htmlfile对象,使用write方法写入浏览器版本,创建parentwindow对象,在使用e......
  • [oeasy]python0017_解码_decode_字节序列_bytes_字符串_str
    ​ 解码decode回忆上次内容code就是码最早也指电报码后来有各种编码、密码、砝码、条码都指的是把各种事物编个号encode就是编码编码就是给事物编个号......