G - Vitya and Strange Lesson(数组-字典树)

2024-03-20 22:38

本文主要是介绍G - Vitya and Strange Lesson(数组-字典树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

G - Vitya and Strange Lesson

 CodeForces - 842D 

Today at the lesson Vitya learned a very interesting function — mex. Mex of a sequence of numbers is the minimum non-negative number that is not present in the sequence as element. For example, mex([4, 33, 0, 1, 1, 5]) = 2 and mex([1, 2, 3]) = 0.

Vitya quickly understood all tasks of the teacher, but can you do the same?

You are given an array consisting of n non-negative integers, and m queries. Each query is characterized by one number x and consists of the following consecutive steps:

  • Perform the bitwise addition operation modulo 2 (xor) of each array element with the number x.
  • Find mex of the resulting array.

Note that after each query the array changes.

Input

First line contains two integer numbers n and m (1 ≤ n, m ≤ 3·105) — number of elements in array and number of queries.

Next line contains n integer numbers ai (0 ≤ ai ≤ 3·105) — elements of then array.

Each of next m lines contains query — one integer number x (0 ≤ x ≤ 3·105).

Output

For each query print the answer on a separate line.

Examples

Input

2 2
1 3
1
3

Output

1
0

Input

4 3
0 1 5 6
1
2
4

Output

2
0
0

Input

5 4
0 1 5 6 7
1
1
4
5

Output

2
2
0
2

 

题意 + 思路:

这两篇博客解释的非常好,我就不多说了

https://blog.csdn.net/brazy/article/details/77841433

 

https://blog.csdn.net/xzzf1024/article/details/79181290

 解释:

  主函数里  再次求MEX的时候 和上次的MEX值异或

            num^=x;           //与上次得到的值异或
            printf("%d\n",num^Find_Trie(num));

这相当于再次输入的X与存在字典树的序列异或。(设存在字典树的序列a,则相当于a^x1^x2);

个人理解+代码:

//MEX求数列中未出现过的最小自然数
//X异或任何一位结果不同
//与存在的数异或后 会再次成为这个N数组的数
//求MEX的值 会出现在 不在这N数组的数。
//再次求MEX的时候 和上次的MEX值异或 就可以了
//
#include <map>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=1e6;
int trie[5*maxn][2];
int vis[5*maxn];
int rt,tot;
void init()
{mem(vis,0);mem(trie,0);tot=0;
}
void Build_Trie(int y)
{rt=0;for(int i=31; i>=0; i--){int x=(y>>i)&1;if(!trie[rt][x])trie[rt][x]=++tot;rt=trie[rt][x];}vis[rt]=y;
}
int Find_Trie(int y)
{rt=0;int ans=0;for(int i=31; i>=0; i--){int x=(y>>i)&1;    //找到最小的异或值if(!trie[rt][x])rt=trie[rt][x^1];elsert=trie[rt][x];}return vis[rt];
}
map<int,int>mp;
int main()
{int n,m,y;while(~scanf("%d%d",&n,&m)){init();mp.clear();int x;for(int i=0; i<n; i++){scanf("%d",&x);mp[x]=1;}for(int i=0; i<=600005; i++){if(!mp[i])Build_Trie(i);}int num=0;for(int i=0; i<m; i++){scanf("%d",&x);num^=x;           //与上次得到的值异或printf("%d\n",num^Find_Trie(num));}}return 0;
}

 

这篇关于G - Vitya and Strange Lesson(数组-字典树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/830991

相关文章

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.