1. 程式人生 > 實用技巧 >AtCoder Regular Contest 098 D - Xor Sum 2

AtCoder Regular Contest 098 D - Xor Sum 2

題意:

給一個長度為N的陣列

然後求滿足 他們的異或和 加和相等的區間

題解:

我們發現,一旦兩個數字有一位都是1,他們會變成0,所以這時候肯定就少了值,換句話說,兩個數異或的最大值,是兩個數的加和

所以列舉每個位置,然後向前異或,因為,所以每次最多20次向前

複雜度20*n,也就是log(ai)*n

#include<cstring>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#define
ll long long using namespace std; const int maxn=200005; int n,a[maxn],lef[maxn]; ll ans=0; int main(){ scanf("%d",&n); for(int i=1,las=0;i<=n;i++){ scanf("%d",a+i),lef[i]=las; if(a[i]) las=i; } for(int i=1,now,j;i<=n;i++){ now=a[i];
for(j=lef[i];j;now^=a[j],j=lef[j]) if(now&a[j]) break; ans+=(ll)(i-j); } cout<<ans<<endl; return 0; }