作者:达人多多宝_836 | 来源:互联网 | 2023-10-13 10:23
题目链接:luoguP4310绝世好题这是链接因为答案只能是由两个在二进制表示下至少有一位同是1的a序列里的数&得到的,最后求子序列的个数f[i]存的是对于a序列
题目链接:luoguP4310 绝世好题

这是链接

因为答案只能是由两个在二进制表示下至少有一位同是1的a序列里的数&得到的,最后求子序列的个数
f[i]存的是对于a序列中当前遍历到的数中有几个在二进制表示下第i位为1,因为求的是子序列的个数而非方案,所以发现当前的数可以与之前的数&之后得到1满足题目要求,答案就只+1
#include
#include
#include
#include
#include
#include
#define over(i,s,t) for(register int i &#61; s;i <&#61; t;&#43;&#43;i)
#define lver(i,t,s) for(register int i &#61; t;i >&#61; s;--i)
using namespace std;typedef long long ll;
typedef pair<int,int> PII;
const ll INF &#61; 1e18;
const int N &#61; 5e5&#43;7;
const int M &#61; 5e4&#43;7;
int a[N];
int n,m,ans;
int f[N];
int main(){cin>>n;over(i,1,n)scanf("%d",&a[i]);over(i,1,n){int maxn &#61; -1;over(j,1,32)if(a[i] & (1<<j))maxn &#61; max(maxn,f[j] &#43; 1);over(k,1,32)if(a[i] & (1<<k))f[k] &#61; maxn;ans &#61; max(maxn,ans);}printf("%d\n",ans);return 0;
}