题目链接
题
面
题面
题面
题
意
题意
题意
给定一个长度为n的序列,找出最长的区间满足:
a
l
&
a
l
+
1
&
.
.
.
&
a
r
>
a
l
⊕
a
l
+
1
⊕
.
.
.
.
⊕
a
r
a_l\&a_{l+1}\&...\&a_r>a_l\oplus a_{l+1}\oplus....\oplus a_r
al&al+1&...&ar>al⊕al+1⊕....⊕ar
题解
该题解充分利用了异或的性质,比较好。
#include <bits/stdc++.h>
using namespace std;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//typedef long long LL;
//#define int LL
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=(s<<1)+(s<<3)+(ch-'0');
ch=getchar();
}
return s*w;
}
const int maxn=1e6+5;
int n;
int a[maxn];
unordered_map<int,int> pos;
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int len=0;
for(int k=20;k>=0;k--){
int res=0;
pos.clear();
pos[0]=1;
for(int i=1;i<=n;i++){
if(!(a[i]&(1<<k))){
pos.clear();
res=0;
pos[0]=i+1;
continue;
}
res=res^(a[i]>>k);
if(!pos[res]) pos[res]=i+1;
else len=max(len,i-pos[res]+1);
}
}
cout<<len<<'\n';
}
signed main(){
// cout<<bitset<20>(260522)<<endl;
ios;
int t;t=1;
while(t--) solve();
return 0;
}