一道简单双指针题。
首先猜结论:\(x\ xor\ y==x+y\)当且仅当\(x\&y==x+y\)
那么,令函数\(f_l\)表示,以\(l\)为左端点最远能拓展到的右端点。
我们可以发现,\(f_{l+1}\)也一定至少能拓展到这个点。
这时候我们则可以在固定左端点的同时移动右端点。每一次移动,从这个右端点到这个左端点之间所有的左端点构成的区间都是合法的。
统计即可得解。
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[200005];
void init(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
}
long long ans=0,nw=0;
int l=1,r=1;
while(r<=n){
while((!(nw&a[r]))&&r<=n){
nw|=a[r++];
ans+=(r-l);
}
nw^=a[l++];
}
printf("%lld",ans);
}
int main(){
init();
return 0;
}
x&y应该是x|y吧?
感谢您提供的宝贵意见(大雾)
(话说是不是我应该装一个表情包插件)
我想了一下,应该就是x&y
当然本质上是一样的。
因为,$$ x\&y == x+y $$当且仅当$$x|y == x+y$$