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; }