【bzoj4300】绝世好题

来源:互联网 发布:软件就业培训中心 编辑:程序博客网 时间:2024/04/28 05:08

绝世傻题

可以和鬼谷子的钱袋相提并论的一道题

AC代码300B,而且还可以更短

显然如果j<k<i,a[i] & (1 << x),a[j] & (1 << x),a[k] & (1 << x),那么如果把j接在i前面,不如把j,k一起接在i前面

所以我们可以只保留含有每一位的最后一个数,然后枚举从哪一位转移过来即可

(这样的题目我都WA了两发,都是细节,代码准确度要加强啊

AC code:

#include <cstdio>#include <algorithm>using namespace std;int n,i,j,a[100050],f[100050],lst[30];int main(){scanf("%d",&n);for (i=1;i<=n;i++) scanf("%d",&a[i]);int ans=1;for (i=1;i<=n;i++)for (j=0;j<=30;j++) if (a[i] & (1 << j)){f[i]=max(f[i],f[lst[j]]+1);lst[j]=i;ans=max(ans,f[i]);}printf("%d\n",ans);return 0;}


1 0