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

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

时间:2022-11-18 11:12:44浏览次数:81  
标签:head 抑或 int MAX 01trie tot 字符串 adj

题目链接在这里: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 }

 

标签:head,抑或,int,MAX,01trie,tot,字符串,adj
From: https://www.cnblogs.com/keximeiruguo/p/16902573.html

相关文章

  • 空字符串判断空失败
    起因是在处理文件的时候,想要自己存入一个固定长度头部,这里是1024个字节,在读取之后获取到一个看似字符串的对象,但是在判空时候失败了。原因是这个看似为空字符串的对象内部......
  • python笔记75-compile() 函数将字符串转字节代码
    前言compile()函数将一个字符串编译为字节代码。compile()使用以下是compile()方法的语法:compile(source,filename,mode[,flags[,dont_inherit]])参数so......
  • 【Python错误】TypeError: sequence item 0: expected str instance, int found【列表
    【错误类型】TypeError:sequenceitem0:expectedstrinstance,intfound前景提要:获得用户输入的以逗号分隔的三个数字,记为a、b、c,以a为起始值,b为前后相邻数的比值,c为......
  • 字符串练习1 于是他错误的点名开始了(Trie)
    题目链接在这里:P2580于是他错误的点名开始了-洛谷|计算机科学教育新生态(luogu.com.cn)是一道trie树的板子题,注意理解trie树的每一个节点代表的是一个状态,这个状态......
  • JAVA字符串应用
    字符串查找判断子字符串是否存在str.indexOf("B");实例运行点击查看代码publicclassstring7{ publicstaticvoidmain(String[]args){ Stringstr1="88......
  • 字符串和编码
    背景:日常工作中,或多或少的都会遇到编码问题,大都定义为UTF-8或者GB2312都能处理,但是总觉得一知半解,今稍微总结下白话理解:1.字符编码产生原因:在计算机底层存储中都是由......
  • 冒泡排序法2.0版本,加输入、输出数组字符串
    大家晚上好呀,今天给大家带来的是冒泡排序法的代码,首先我们以一些简单的数字来举例,根据昨天已有的知识点,我们可以利用二重循环写出基本代码,如图但是我这个有问题,但我目前还没......
  • Java中的字符串
    String类声明字符串声明一个字符串就是创建一个字符串对象。语法Stringa;Stringa,b,c;注意Stringa;相当于Stringa=null;创建字符串给字符串赋值的方法:1.......
  • JavaScript字符串MD5
    进行HTTP网络通信的时候,调用API向服务器请求数据,有时为了防止API调用过程中被黑客恶意篡改,所请求参数需要进行MD5算法计算,得到摘要签名。服务端会根据请求参数,对签名进行验......
  • 09python字符串
    在05python字符串基础中我们已经大致介绍过字符串,知道如何创建字符串,以及如何使用索引和切片来访问字符串中的字符。这篇文章主要介绍如何使用字符串来设置其他值的格式(比......