列表

详情


DD10. xor

描述

给出n个数字 a_1,...,a_n,问最多有多少不重叠的非空区间,使得每个区间内数字的xor都等于0。

输入描述

第一行一个整数n; 第二行n个整数 a_1,...,a_n; 对于30%的数据,n<=20; 对于100%的数据,n<=100000, a_i<=100000;

输出描述

一个整数表示最多的区间个数;

示例1

输入:

4
3 0 2 2

输出:

2

原站题解

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-10-31

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    while(cin >> n){
        int ans = 0;
        int res = 0;
        int t;
        map<int, bool> tmp;
        tmp[0] = true;
        while(n--){
            cin >> t;
            res ^= t;
            if(tmp.count(res)){
                ans++;
                tmp.clear();
            }
            tmp[res] = true;
        }
        cout << ans << endl;
    }
    return 0;
}

C++14 解法, 执行用时: 2ms, 内存消耗: 480KB, 提交时间: 2020-08-21

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n, tmp, k=0, res=0;
    scanf("%d", &n);
    unordered_map<int, bool> mp;
    mp[0]=true;
    while(n--){
        scanf("%d", &tmp);
        k^=tmp;
        if(mp[k])  res++, k=0, mp.clear();
        mp[k]=true;
    }
    cout<<res<<endl;
    return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 376KB, 提交时间: 2021-02-02

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
using namespace std;
const int MAXN=1e5+50;
int a[MAXN];
set<int> s; 
int tmp;
int main ()
{
	s.clear();	s.insert(0);
	int n,ans=0;
    cin>>n;
    rep(i,0,n) 	cin>>a[i]; 
	tmp=0;
	rep(i,0,n)
	{
		tmp=tmp^a[i];
		if(s.find(tmp)!=s.end() || a[i]==0)
		{
			ans++;
			s.clear();	s.insert(0);
			tmp=0;
		}
		else
		{
			s.insert(tmp);
		}
	} 
	cout<<ans<<endl; 
	return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 376KB, 提交时间: 2020-12-05

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;
    while(cin>>n){
        int cur;
        int res = 0;
        int cur_xor = 0;
        unordered_set<int> s;
        s.insert(0);
        for(int i = 0; i < n; i++){
            cin>>cur;
            cur_xor ^= cur;
            if(s.find(cur_xor) != s.end()){
                res++;
                s.clear();
            }
            s.insert(cur_xor);
            
        }


        cout<<res<<endl;
        
    }
    return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 376KB, 提交时间: 2020-08-21

#include <iostream>
#include <vector>
#include <map>
using namespace std;

int main(void){
    int n;
    while(cin >> n){
        int ans = 0;
        int res = 0;
        int t;
        map<int, bool> tmp;
        tmp[0] = true;
        while(n--){
            cin >> t;
            res ^= t;
            if(tmp.count(res)){
                ans++;
                tmp.clear();
            }
            tmp[res] = true;
        }
        cout << ans << endl;
    }
    return 0;
}

上一题