XOR and Less
首先发现把
我们令
对于每一位:
即答案只可能在加入一个数时出现
精细实现可以做到
::::success[Code]
#include <bits/stdc++.h>
using namespace std;
void Ios(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}
#define REP(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define fir first
#define sec second
#define pb push_back
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define ll long long
#define int long long
#define umap unordered_map
const int maxn=5e5+10;
const int mod=998244353;
int a[maxn];
int ne[33][maxn];
int lg(int x)
{
if(x==0) return 0;
return __lg(x);
}
signed main()
{
Ios();
int n;
cin>>n;
REP(i,1,n) cin>>a[i];
REP(w,0,32) ne[w][n+1]=1e9;
REP(w,0,32)
for(int i=n;i>=1;i--)
if((a[i]>>w)&1) ne[w][i]=i;
else ne[w][i]=ne[w][i+1];
int ans=0;
REP(i,1,n)
{
int sta=0,mx=0,neans=0;
mx=max(mx,lg(sta&a[i]));
sta|=a[i];
neans=(sta|((1ll<<mx)-1));
vector<int> ps;
REP(w,0,32)
{
ps.pb(ne[w][i]);
if(ne[w][i]<=n) ps.pb(ne[w][ne[w][i]+1]);
}
ps.pb(i),ps.pb(1e9);
sort(all(ps));
for(int j=0;j<ps.size()-1;j++)
if(ps[j]!=ps[j+1])
{
int pos=ps[j];
if(pos>=n) break;
int mngx=min(ps[j+1],n);
ans+=(mngx-pos)*neans;ans%=mod;
mx=max(mx,lg(sta&a[mngx]));
sta|=a[mngx];
neans=(sta|((1ll<<mx)-1));
}
ans+=neans;ans%=mod;
}
cout<<ans;
}