时间限制:1S
空间限制:32768K
题目描述:
给出n个数字a_1 , …, a_n,问最多有多少个不重叠的非空区间,使得每个区间内的数字的xor都等于0。
即找出最大的k,使得存在k个区间(l[i], l[j]),满足1<=l[i]<=l[j]<=n(1<=i<=k),r[i] < l[l+1](1 <= i < k),且a[l[i]] xor a[l[i+1]] xor … xor a[r[i]] = 0(1<=i<=k)
输入描述:
第一行一个数字n
第二行n个数字
输出描述:
输出最多的区间的个数
示例:
输入
3 0 2 2
输出
2
解题思路:首先要读懂题意,不重叠的区间,区间需要连续,某些数可以不选,划分为最多的区间,区间的所有的数异或结果为0。
然后我们解题的时候可以保存从头开始一直异或到当前位置i的值,如果后面位置j有出现异或的值位置i的值一样的话,那么区间[i, j]就是一个异或结果为0的区间。
所以我们可以用一个set或者map更新一下。每重复出现一次就清空一下所有信息并且答案++,然后重新保存set或map。开始的时候要放一个map[0]为了考虑边界条件(也就是一开始就是0的情况)。
#include <iostream>
#include <map>
using namespace std;
int main()
{
int n, x;
while(cin >> n)
{
map<int, bool> M;
int res = 0, ans = 0;
M[0]++;
while(n--)
{
cin >> x;
res^=x;
if(M[res])
{
M.clear();
ans++;
}
M[res] = true;
}
cout << ans << endl;
}
return 0;
}