引言

刚学了\(Trie\)树,写篇博客巩固一下。

题目

首先安利一发\(Trie\)树模板

1、Phone List

2、The XOR largest pair

3、The xor-longest Path

4、Codechef REBXOR

第一题不难,但是我用的是暴力。

构造一棵\(Trie\)树,然后把字符串长度从大到小排序,然后按顺序插入。若在插入的时候\(Trie\)树结点一直不为空,那么该串为其的子串。

\(Code\ Below:\)

#include <bits/stdc++.h>
using namespace std;
int n,trie[100010][10],ans,tot;
char s[100010][15];
struct node{int len,id;
}l[100010];
void insert(int k){int len=strlen(s[k]),p=0,b=0;for(int i=0;i<len;i++){if(trie[p][s[k][i]-'0']==-1) {trie[p][s[k][i]-'0']=++tot;b=1;}p=trie[p][s[k][i]-'0'];}if(b==0) ans=1;
}
bool cmp(node a,node b){return a.len>b.len;
}
int main()
{int t;scanf("%d",&t);while(t--){memset(trie,-1,sizeof(trie));scanf("%d",&n);ans=0;tot=0;for(int i=1;i<=n;i++){scanf("%s",s[i]);l[i].len=strlen(s[i]);l[i].id=i;}sort(l+1,l+n+1,cmp);for(int i=1;i<=n;i++){if(ans==0) insert(l[i].id);}if(ans==1) printf("NO\n");else printf("YES\n");}return 0;
}

第二题构造一棵\(Trie\)树,然后根据异或的运算规则,尽量当前的值与结点的值不一样。
此题是二三题的基础。

\(Code\ Below:\)

#include <cstdio>
int n,trie[100010*31][2],ans=0,val,tot=0;
int max(int a,int b){return a>b?a:b;}
int search(int x){int p=0,num=0,c;for(int i=31;i>=0;i--){c=(x>>i)&1;if(trie[p][c^1])p=trie[p][c^1],num=num<<1|1;else p=trie[p][c],num=num<<1;}return num;
}
void insert(int x){int p=0,c;for(int i=31;i>=0;i--){c=(x>>i)&1;if(!trie[p][c]) trie[p][c]=++tot;p=trie[p][c];}
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&val);ans=max(ans,search(val));insert(val);}printf("%d\n",ans);return 0;
}

定义前缀异或和\(sum[1..i]=a[1]\)^\(...\)^\(a[i]\),\(v[i..j]=a[i]\)^\(a[i+1]\)^\(...\)^\(a[j]\),则\(v[i..j]=sum[1..i] * sum[1..j]\)

由于\(a^a=0,0^a=a,\)所以异或两次值不变。

那么预处理出树上前缀异或和(即到根的前缀异或和),跑一遍\(The\ XOR\ largest\ pair\)

\(Code\ Below:\)

#include <cstdio>
int n,trie[100010*31][2],ans=0,a[100010],val,tot=0,t=0,head[100010];
int max(int a,int b){return a>b?a:b;}
struct node{int to,val,next;
}e[100010*2];
void add(int x,int y,int w){e[++t].to=y;e[t].val=w;e[t].next=head[x];head[x]=t;
}
void dfs(int x,int fa,int now){a[x]=now;for(int i=head[x];i;i=e[i].next){int y=e[i].to;if(y==fa) continue;dfs(y,x,now^e[i].val);}
}
int search(int x){int p=0,num=0,c;for(int i=31;i>=0;i--){c=(x>>i)&1;if(trie[p][c^1])p=trie[p][c^1],num=num<<1|1;else p=trie[p][c],num=num<<1;}return num;
}
void insert(int x){int p=0,c;for(int i=31;i>=0;i--){c=(x>>i)&1;if(!trie[p][c]) trie[p][c]=++tot;p=trie[p][c];}
}
int main()
{scanf("%d",&n);for(int i=1;i<n;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);add(x,y,w);add(y,x,w);}dfs(1,1,0);for(int i=1;i<=n;i++){ans=max(ans,search(a[i]));insert(a[i]);}printf("%d\n",ans);return 0;
}

第四题预处理出前缀异或和和后缀异或和,然后用\(O(n)\)的时间求最大值

\(Code\ Below:\)

#include <cstdio>
int n,trie[400010*31][2],ans=0,val,tot=0,a[100010],l[400010],r[400010];
int max(int a,int b){return a>b?a:b;}
int search(int x){int p=0,num=0,c;for(int i=31;i>=0;i--){c=(x>>i)&1;if(trie[p][c^1])p=trie[p][c^1],num=num<<1|1;else p=trie[p][c],num=num<<1;}return num;
}
void insert(int x){int p=0,c;for(int i=31;i>=0;i--){c=(x>>i)&1;if(!trie[p][c]) trie[p][c]=++tot;p=trie[p][c];}
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);int now=0;insert(now);for(int i=1;i<=n;i++){now^=a[i];l[i]=max(l[i-1],search(now));insert(now);}now=0;insert(now);for(int i=n;i>=1;i--){now^=a[i];r[i]=max(r[i+1],search(now));insert(now);}for(int i=1;i<n;i++){ans=max(ans,l[i]+r[i+1]);}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/owencodeisking/p/9735350.html

[学习笔记]我们追过的神奇异或(Trie树系列)相关推荐

  1. 【学习笔记+习题集】字符相关(输入输出流,字典树,AC自动机,后缀自动机)(4598字)(更新至2022.12.28)

    目录 板块零:输入输出流 情况一:读取字符串和读取行混用的时候 情况二:关于识别空行 第一题:hdoj2072 情况三:用char数组接受getline函数的输入流 情况四:关于汉字 补充练习: 第一 ...

  2. 【三万字!】Dubbo、Zookeeper学习笔记!秒杀面试官!——双非上岸阿里巴巴系列

    东北某不知名双非本科,四面成功上岸阿里巴巴,在这里把自己整理的笔记分享出来,欢迎大家阅读. 恰个饭--><阿里巴巴 Java 开发手册>,业界普遍遵循的开发规范 本博客内容持续维护, ...

  3. 统计学习笔记(3)——k近邻法与kd树

    在使用k近邻法进行分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决的方式进行预测.由于k近邻模型的特征空间一般是n维实数向量,所以距离的计算通常采用的是欧式距离.关键的是k值的选取, ...

  4. 【学习笔记】浅谈短小可爱的左偏树(可并堆)

    文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...

  5. cs224w(图机器学习)2021冬季课程学习笔记4 Link Analysis: PageRank (Graph as Matrix)

    诸神缄默不语-个人CSDN博文目录 cs224w(图机器学习)2021冬季课程学习笔记集合 文章目录 1. Graph as Matrix 2. PageRank / the Google Algor ...

  6. cs224w(图机器学习)2021冬季课程学习笔记9 Graph Neural Networks 2: Design Space

    诸神缄默不语-个人CSDN博文目录 cs224w(图机器学习)2021冬季课程学习笔记集合 文章目录 1. A General Perspective on Graph Neural Networks ...

  7. PMBOK(第六版) 学习笔记 ——《第七章 项目成本管理》

    系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...

  8. PMBOK(第六版) 学习笔记 ——《第一章 引论》

    系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...

  9. PMBOK(第六版) 学习笔记 ——《考试、成绩、PDU》

    系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...

最新文章

  1. Android基本概念(一)
  2. 三步更改win7开机密码
  3. nodejs渐入佳境[8]-json处理
  4. mybatis java8_mybatis如何使用Java8的日期LocalDate和LocalDateTime详解
  5. WampServer修改端口及菜单Localhost
  6. yan-round-sysuser的pom.xml文件
  7. jzoj1281-旅行【dp】
  8. 唯有自己变得强大_物竞天择,适者生存,唯有强大自己,方能百毒不侵
  9. python开发mbus程序_Python pywmbus包_程序模块 - PyPI - Python中文网
  10. Leetcode每日一题:724.Find Pivot Index(寻找中心索引)
  11. 记一次失败的RecycleView滑动定位
  12. 进阶篇:3.4.1)机械加工件-不同制造工艺详解和对应设备
  13. CSS中背景图片的坐标之使用说明及css中把所有背景图都放在一张图片上减少图片服务器的请求次数问题(转)...
  14. c 语言试题及解析,C语言试题及答案解析.pdf
  15. AS+图灵机器人官网+HTTP POST(json)+JsonReader实现安卓课设《智能聊天机器人》填坑记录
  16. [prolog 基础系列] Prolog 的使用以及 Knowledge Base
  17. webp格式怎么改png?如何将webp转换格式?
  18. 一步到位Composer直接打开SOLIDWORKS贴图
  19. 揭秘 Longhorn 如何为 3.5万 个 Kubernetes 节点提供持久存储?
  20. 站群教程SEO推广(SEO教程)

热门文章

  1. 搭建discuz论坛
  2. Css 特殊或不常用属性
  3. RSA key format is not supported
  4. UT890D的二极管档的使用
  5. 如何一次性复制带有markdown/mathjax/latex的博客内容
  6. 什么是OLAP和OLTP
  7. “TypeError: 'dict_keys' object is not subscriptable”
  8. 机器学习(十一)——机器学习中的矩阵方法(1)LU分解、QR分解
  9. linux的mutex状态查询命令,如何断言std :: mutex是否已锁定?
  10. Java中的ThreadLocal的使用--学习笔记