思路
設
那麼只需要找到當前數加入某些序列能得到的最長的長度
再用最長長度去更新
#include <cstdio>
using namespace std;
template <class T>T Max(const T &a , const T &b) {return a > b ? a : b;}
const int SN = 100000 + 10;
int f[SN], n, a[SN], ans;
void Read(int &x) {
int in = 0,f = 1;char ch = getchar();
while(ch<'0' || ch>'9') {if(ch=='-') f = -1; ch = getchar();}
while(ch>='0' && ch<='9') {in = in*10+ch-'0';ch = getchar();}
x = in*f;
}
int main() {
Read(n);
for(int i = 1; i <= n; i++) Read(a[i]);
for(int i = 1; i <= n; i++) {
int t = a[i],k = 1,tmp = 0;
while(t) {
if(t & 1) tmp = Max(tmp, f[k]+1);
t >>= 1;
k++;
}
t = a[i], k = 1;
while(t) {
if(t & 1) f[k] = tmp;
t >>= 1;
k++;
}
ans = Max(ans , tmp);
}
printf("%d\n",ans);
return 0;
}