给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。
输入文件共2行。
第一行包括一个整数n。
第二行包括n个整数,第i个整数表示ai。
输出文件共一行。
包括一个整数,表示子序列bi的最长长度。
Sample Output2Hint
n<=100000,ai<=2*10^9
如果每个位置有一个为0的话,&的结果为0,只有全一的时候才为1
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<set> #include<map> #include<vector> #include<cmath> const int maxn=1e5+5; typedef long long ll; using namespace std; int dp[50],n,a[maxn],tmp,ans; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { tmp = 0; for(int j=0;j<=30;j++) if(a[i]&(1<<j)) tmp=max(tmp,dp[j]+1); for(int j=0;j<=30;j++) if(a[i]&(1<<j)) dp[j]=tmp; ans=max(ans,tmp); } cout<<ans<<endl; }