#include <bits/stdc++.h>
using namespace std;
using PII = pair<int,int >;
using ll = long long;
using namespace std;
int n,m;
int a[200010];
int sum[200010];
int t;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
sum[i] = sum[i-1] | a[i];
}
cout<<sum[n]<<" ";
int s = 0;
int ct = 0;
for(int i=n;i>=1;i--){
s |= a[i];
if((s + sum[i-1]) == sum[n])ct++;
}
cout<<ct;
}
抄了一下别人的做法,就是找到 | 的节点 可以替换为 + 的位置
维护一个前缀或 从尾巴开始遍历维护一个后缀或
当这个后缀或 + sum[i-1] == s[n] 即如果从这个位置划分不会影响结果
——————————————————————————————
关于我自己的做法,一时半会没想明白哪错
就是 | 和 + 当 a & b == 0 时 ,两者的操作时等效的,
那么从头开始统计,如果 s & a[i] == 0 那么代表a[i] 可以和 s 并在一起 此时 s |= a[i]
或者s += a[i] 此时操作一样,那么就考虑把 a[i] 划出当前区间,
但这有点问题,待我想想
蠢了
a | b | c 变成了 a + b + c
如果bc放在一起 那么就变 a + (b | c) 当时 b | c 不一定和a 满足刚刚那个操作