AcWing 4645. 选数异或

简介: 每日打卡

传送门 AcWing 4645. 选数异或  

image.png

通过读题我们可以知道,给我们一个区间,进行m次询问,每次询问一个区间内是否存在一个两个下标不同的数的异或等于x。因为a^b = x 与 a = b^x是等价的,那我们不妨使用一个数组来记录i前最近一个与当前数ai异或x之后的值相同值的位置。若这个值在给定区间的左边时,则表示区间内并没有符合条件的数值存在。

image.png


若值在区间内则说明存在值能够满足条件。

image.png

即1<i<r,若存在1<last[a^x]<i,则说明存在值满足题目条件。我们还可以使用一个数组s记录最近一个满足条件的下标。若s[r]的值大于等于l则说明最近一个满足条件的值在限定的区间之中。直接看代码可能更加地直观一些。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010,M = (1<<20)+10;
int n,m,x;
int last[M],s[N];
int main()
{
    scanf("%d%d%d",&n,&m,&x);
    for(int i = 1;i<=n;i++)
    {
        int a;
        scanf("%d",&a);
        s[i] = max(s[i-1],last[a^x]);
        last[a] = i;
    }
    while(m--)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        if(s[r]>=l) puts("yes");
        else puts("no");
    }
    return 0;
}

image.gif

目录
打赏
0
0
0
0
55
分享
相关文章
|
5月前
acwing 841 字符串哈希
acwing 841 字符串哈希
30 0
|
9月前
|
C++
【洛谷 P1706】全排列问题 题解(全排列)
该问题要求按字典序输出从1到n的所有不重复排列。输入为整数n,输出为每行一个的数字序列,每个数字占5个宽度。样例输入3,输出6行全排列。代码使用C++,通过`next_permutation`函数生成所有排列。注意n的范围是1到9。
83 0
|
9月前
【LeetCode刷题】两数之和、两数相加
【LeetCode刷题】两数之和、两数相加
leetcode每日一题.445:两数相加II
leetcode每日一题.445:两数相加II
95 0
AcWing 715. 余数
AcWing 715. 余数
85 0
AcWing 715. 余数
AcWing 777. 字符串乘方
AcWing 777. 字符串乘方
95 0
AcWing 777. 字符串乘方
AcWing 808. 最大公约数
AcWing 808. 最大公约数
94 0
AcWing 808. 最大公约数
AcWing 726. 质数
AcWing 726. 质数
64 0
AcWing 726. 质数
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等