忍不住吐槽一下这个题目,绝世好题……出题人有毒的吧……
看到数据范围,想 O(nlogn) 的搞,但是没有任何思路……
定义
f[i]
表示处理到当前的数,第
i
位不为
附上AC代码:
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
int n,f[31],x,ans;
inline char nc(void){
static char ch[100010],*p1=ch,*p2=ch;
return p1==p2&&(p2=(p1=ch)+fread(ch,1,100010,stdin),p1==p2)?EOF:*p1++;
}
inline void read(int &a){
static char c=nc();int f=1;
for (;!isdigit(c);c=nc()) if (c=='-') f=-1;
for (a=0;isdigit(c);a=(a<<3)+(a<<1)+c-'0',c=nc());
return (void)(a*=f);
}
int main(void){
read(n);
for (int i=1; i<=n; ++i){
read(x),ans=0;
for (int j=0; j<=30; ++j) if (x&(1<<j)) ans=max(ans,f[j]);
++ans;
for (int j=0; j<=30; ++j) if (x&(1<<j)) f[j]=max(ans,f[j]);
}
ans=0;
for (int i=0; i<=30; ++i) ans=max(ans,f[i]);
return printf("%d\n",ans),0;
}