CF 1438E
unique&erase: https://blog.csdn.net/hellokandy/article/details/51317593
参考博文:https://www.cnblogs.com/DeepJay/p/14115735.html
这个代码是真的简洁清晰,看的太舒服了
https://codeforces.ml/contest/1438/problem/E
1 #include
2 #define ll long long
3 using namespace std;
4 typedef pair<int, int> pii;
5 const int N = 2e5 + 10;
6 int n;
7 ll a[N], sum[N];
8 vector v;
9
10 void solve(int tag)
11 {
12 for(int i = 1 ; i <= n ; i++){
13 sum[i] = sum[i - 1] + a[i];
14 }
15 for(int l = 1 ; l < n - 1 ; l++){
16 int b;for(b = 30 ; b >= 0 ; b--){
17 if((1 << b) & a[l]) break;
18 }
19 ll up = (1 << (b + 1));
20 for(int r = l + 2 ; r <= n ; r++){
21 ll tmp = sum[r - 1] - sum[l];
22 if(tmp >= up) break;
23 else if((a[l] ^ a[r]) == tmp){
24 if(!tag) v.push_back({l, r});
25 else v.push_back({n - r + 1, n - l + 1});
26 }
27 }
28 }
29 }
30
31 int main(){
32 ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
33 cin >> n;
34 for(int i = 1 ; i <= n ; i++){
35 cin >> a[i];
36 }
37 solve(0);
38 reverse(a + 1, a + n + 1);
39 solve(1);
40 sort(v.begin(), v.end());
41 v.erase(unique(v.begin(), v.end()), v.end());
42 //unique返回不重复的最后一个元素的后一个地址
43 //erase则将这一部分重复元素删除
44 cout << (int)v.size() << endl;
45
46 return 0;
47 }