#include<iostream> #include<vector> using namespace std;    //此题有一个要点,就是只要找到了某个区间xor为0,那么后面的数据就跟 //前面的没有关系了。因为区间不能重叠 int main() { int n; cin >> n; vector<int> input(n, 0); for (int i = 0; i < n; i++) cin >> input.at(i);   //数据输入 int k = 0; vector<int> num;   //用于记录当前所有的可能值 for (int i = 0; i < n; i++) { if (input.at(i) == 0) { k += 1; num.clear(); continue;   //  跟样例一个道理,0 就直接是0。。。。 } if (input.at(i)>0) { int flag = 0; for (int j = 0; j < num.size(); j++) { num.at(j) = num.at(j) ^ input.at(i); if (num.at(j) == 0) { flag = 1; k += 1; num.clear(); }                         }                                          //此处我举个例子,比如找第一个区间,现在循环到了第五位,有几种情况?                                          //   input.at(0) ^ input.at(1) ^ input.at(2) ^ input.at(3) ^ input.at(4)                                          //                       input.at(1) ^ input.at(2) ^ input.at(3) ^ input.at(4)                                          //                                           input.at(2) ^ input.at(3) ^ input.at(4)                                          //                                                               input.at(3) ^ input.at(4)                                          //                                                                                   input.at(4)                                         // 这样得到5个数字。来了第6个数,分别于他们xor,发现哪个结果是0,就找                                           // 到本个区间了,然后将记录清空,继续下一个 if (flag == 0) num.push_back(input.at(i)); } } cout << k << endl; return 0; }
点赞 1

相关推荐

牛客网
牛客企业服务