AT4142 [ARC098B] Xor Sum 2(尺取法)
阿新 • • 發佈:2021-08-08
洛谷傳送門
解題思路
考慮異或性質,發現對於每一二進位制位單獨來看,兩個數相加和異或結果一樣,而要想最終結果相等,則要保證加法每一位都不進位。
所以這道題就轉化為要求每個二進位制位只有一個1。
AC程式碼
#include<iostream> #include<algorithm> #include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #include<queue> #include<set> #include<map> #include<vector> #include<iomanip> #include<ctime> #include<stack> using namespace std; const int maxn=2e5+5; int n,a[maxn],vis[25],r=1; long long ans; bool check(int x){ for(int i=0;i<=20;i++){ if((x&(1<<i))&&vis[i]) return 0; } return 1; } inline void add(int x){ for(int i=0;i<=20;i++){ if(x&(1<<i)) vis[i]=1; } } inline void del(int x){ for(int i=0;i<=20;i++){ if(x&(1<<i)) vis[i]=0; } } int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++){ while(r<=n&&check(a[r])) add(a[r++]); ans+=r-i; del(a[i]); } cout<<ans; return 0; }