bzoj千题计划190:bzoj4300: 绝世好题
http://www.lydsy.com/JudgeOnline/problem.php?id=4300
f[i] 表示第i位&为1的最长长度
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } int f[31]; int bit[31]; int x; int main() { int n; read(n); bit[0]=1; for(int i=1;i<=30;++i) bit[i]=bit[i-1]<<1; int tmp; while(n--) { read(x); tmp=0; for(int i=0;i<=30;++i) if(x&bit[i]) tmp=max(tmp,f[i]); tmp++; for(int i=0;i<=30;++i) if(x&bit[i]) f[i]=tmp; } int ans=0; for(int i=0;i<=30;++i) ans=max(ans,f[i]); cout<<ans; }
4300: 绝世好题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 2372 Solved: 1281
[Submit][Status][Discuss]
Description
给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。
Input
输入文件共2行。
第一行包括一个整数n。
第二行包括n个整数,第i个整数表示ai。
Output
输出文件共一行。
包括一个整数,表示子序列bi的最长长度。
Sample Input
3
1 2 3
1 2 3
Sample Output
2
HINT
n<=100000,ai<=2*10^9