给定一个长度为 n 的数列 A1,A2,···,An 和一个非负整数 x,给定 m 次查询,每次询问能否从某个区间 [l,r] 中选择两个下标不同的数使得他们的异或等于 x。
输入格式
输入的第一行包含三个整数 n,m,x。
第二行包含 n 个整数 A1,A2,···,An。
接下来 m 行,每行包含两个整数 li,ri 表示询问区间 [li,ri]。
输出格式
对于每个询问,如果该区间内存在两个数的异或为 x 则输出 yes,否则输出 no。
数据范围
对于 20% 的评测用例,1≤n,m≤100;
对于 40% 的评测用例,1≤n,m≤1000;
对于所有评测用例,1≤n,m≤100000,0≤x<220,1≤li≤ri≤n,0≤Ai<220。
输入样例:
4 4 1
1 2 3 4
1 4
1 2
2 3
3 3
输出样例:
yes
no
yes
no
思路 :
a ⊕ a = 0
a ⊕ 0 = a
a ⊕ b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c
a ⊕ b = b ⊕ a
a ⊕ b = c ⟺ a ⊕ c = b
1 2 3 4
,只有2 3的异或为1#include
#include
using namespace std;
const int N = 1e5 + 10;int n, m, x;
int dp[N];
unordered_map last;int main() {cin >> n >> m >> x;for (int i = 1, a; i <= n && cin >> a; ++ i) {dp[i] = max(dp[i - 1], last[a ^ x]);last[a] = i;}while (m -- ) {int l, r;cin >> l >> r;cout << (dp[r] >= l ? "yes" : "no") << endl;}
}