引言

刚学了\(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;
}

[学习笔记]我们追过的神奇异或(Trie树系列)的更多相关文章

  1. VC++ 学习笔记(序):神一样的语言

    总的来说,我觉得VC++是一门神一样的语言——它是公认最强大.最复杂的:它一切以效率为第一要务,却又不肯落伍,拼命兼容现在的新的语言设计特点.本来在别的语言很容与就避开的问题,在这里要用很高的技巧去设 ...

  2. Angular 学习笔记 ( 我追的 feature 和 bug )

    Angular 有许多功能还不齐全,也有不少 bug 让人很头疼,所以这里做一些记入 Angular Bug 1.input type="number", valueChanges ...

  3. Unity3D之Mecanim动画系统学习笔记(九):Blend Tree(混合树)

    认识Blend Tree 我们在Animator Controller中除了可以创建一个State外还可以创建一个Blend Tree,如下: 那么我们看下新创建的Blend Tree和State有什 ...

  4. MongoDB学习笔记~为IMongoRepository接口添加了排序和表达式树,针对官方驱动

    回到目录 MongoDB的官方驱动,语法更好,更强 之前写过关于IMongoRepository仓储的文章,在mongodb的驱动选择上使用了NoRM,但是进行$ref引用类型导航时出现了问题,它对引 ...

  5. [学习笔记]dsu on a tree(如何远离线段树合并)

    https://www.zybuluo.com/ysner/note/1318613 背景 这玩意来源于一种有局限性的算法. 有一种广为人知的,树上离线维护子树信息的做法. (可以参照luogu360 ...

  6. 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫

    定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...

  7. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  8. MongoDB学习笔记系列~目录

    MongoDB学习笔记~环境搭建 (2015-03-30 10:34) MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00) MongoDB学习笔 ...

  9. LM3S之boot loader学习笔记-1

    LM3S之boot loader学习笔记-1 彭会锋 (首先声明,此系列文章编写参考了很多资料,其中一些内容是原版内容的引用和整理,并加入了一些自己的见解,我已经尽量标明引用部分,如有未全部标注部分, ...

随机推荐

  1. Django高级篇一RESTful架构及API设计

    一.什么是RESTful架构? 通过互联网通信,建立在分布式体系上"客户端/服务器模式”的互联网软件,具有高并发和高延时的特点. 简单的来说,就是用开发软件的模式开发网站.网站开发,完全可以 ...

  2. kbmmw 中XML 操作入门

    delphi 很早以前就自带了xml 的操作,最新版里面有三种XML 解释器,一种是MSXML,看名字就知道 这个是微软自带的,这个据delphi 官方称是速度是最快的,但是只能在windows 上使 ...

  3. 使用Hadoop API 解压缩 HDFS文件

    接上篇:使用Hadoop API 压缩HDFS文件 压缩完了,当然需要解压缩了. 直接上代码: private static void getFile(String filePath) throws ...

  4. 2018.12.30 bzoj3028: 食物(生成函数)

    传送门 生成函数模板题. 我们直接把每种食物的生成函数列出来: 承德汉堡:1+x2+x4+...=11−x21+x^2+x^4+...=\frac 1{1-x^2}1+x2+x4+...=1−x21​ ...

  5. 实现一套山寨springMVC

    重复造轮子没有意义,但是通过现已存在的轮子,模仿着思路去实现一套,还是比较cool的.花了三天,终于深夜搞定!收益都在代码里,我干了,您随意! 一.简单思路 简单介绍: 1.所有的请求交给TyDisp ...

  6. (19)3 moons and a planet that could have alien life

    https://www.ted.com/talks/james_green_3_moons_and_a_planet_that_could_have_alien_life/transcript00:1 ...

  7. 学以致用十一-----centos7.2+python3+YouCompleteMe走过的坑

    目的,安装YouCompleteMe 插件 参考的资料 https://blog.csdn.net/zs376957686/article/details/77833953 https://www.c ...

  8. 好文推荐系列---------(4)使用Yeoman自动构建Ember项目

    好文原文地址:http://segmentfault.com/a/1190000000368881 我决定学习前端开发的效率工具Yeoman.本文将首先介绍Yeoman的基本情况,接着我们会使用Yeo ...

  9. GIS矢量数据化简:一种改进的道格拉斯-普克算法以及C++实现

    GIS领域的同志都知道,传统的道格拉斯-普克算法都是递归实现.然而有时候递归的层次太深的话会出现栈溢出的情况.在此,介绍一种非递归的算法. 要将递归算法改为非递归算法,一般情况下分为两种场景.第一种是 ...

  10. XCode中常用错误解决

    No such file or directory     解决方法(可以依次尝试,总有一种能最终解决问题):          方法1.退出Xcode,然后从finder里面进入~/Library/ ...