Description
给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。
水题一道,只要两个数有某一位上都为
1
,那么这两个数就能相邻,所以,我们只需要知道以某一位上为
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100006
using namespace std;
int n,ans,f[40],a[maxn];
int _read(){
char ch=getchar();int sum=0;
while(!(ch>='0'&&ch<='9'))ch=getchar();
while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=getchar();
return sum;
}
int main(){
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);
n=_read();
for(int i=1;i<=n;i++)a[i]=_read();
for(int i=1;i<=n;i++){
int x=a[i],p=0,Max=0;
while(x>0){
p++;
if((x&1)==1)Max=max(Max,f[p]);
x>>=1;
}
x=a[i],p=0;
while(x>0){
p++;
if((x&1)==1)f[p]=max(f[p],Max+1);
x>>=1;
}
}
for(int i=1;i<=30;i++)ans=max(ans,f[i]);
printf("%d",ans);
return 0;
}