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<bits/stdc++.h>
 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<pii> 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 }
原文地址:https://www.cnblogs.com/ecustlegendn324/p/14291715.html