正题
题目链接:https://www.luogu.org/problem/P4310
题目大意
一个长度为nnn的序列,求一个最长的子序列使得每个数&\&&前一个数不为0。
解题思路
因为是&\&&不为0,所以只要有一位都为1即可。
用fif_ifi表示以第iii个结尾的最长子序列长度,然后ziz_izi表示枚举到现在为止第iii位为111的最大的fif_ifi。然后枚举位数即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=101000;
int n,f[N],z[35],ans;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){int x;scanf("%d",&x);for(int j=0;j<=30;j++)if(x&(1<<j)) f[i]=max(f[i],z[j]+1);for(int j=0;j<=30;j++)if(x&(1<<j)) z[j]=max(z[j],f[i]);ans=max(ans,f[i]);}printf("%d",ans);
}