《P4310 绝世好题》
题目描述
给定一个长度为 n 的数列 ai,求 ai 的子序列 bi 的最长长度 k,满足 bi&bi−1=0,其中 2≤i≤k, & 表示位运算取与。
输入格式
输入文件共 2 行。 第一行包括一个整数 n。 第二行包括 n 个整数,第 i 个整数表示 ai。
输出格式
输出文件共一行。 包括一个整数,表示子序列 bi 的最长长度。
输入输出样例
输入 #1复制
3 1 2 3
输出 #1复制
2
说明/提示
对于 100% 的数据,1≤n≤100000,ai≤109。
代码实现:
#include <cstdio>
#include <algorithm>
const int M=35;
int n,f[M];
int main() {
scanf("%d",&n);
for(int x;n--;) {
scanf("%d",&x);
int m=1;
for(int i=0;i<=30;++i) if(x&(1<<i)) m=std::max(m,f[i]+1);
for(int i=0;i<=30;++i) if(x&(1<<i)) f[i]=std::max(f[i],m);
}
int a=0;
for(int i=0;i<=30;++i) a=std::max(a,f[i]);
printf("%d\n",a);
return 0;
}