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=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int f[];
int bit[]; int x; int main()
{
int n;
read(n);
bit[]=;
for(int i=;i<=;++i) bit[i]=bit[i-]<<;
int tmp;
while(n--)
{
read(x);
tmp=;
for(int i=;i<=;++i)
if(x&bit[i]) tmp=max(tmp,f[i]);
tmp++;
for(int i=;i<=;++i)
if(x&bit[i]) f[i]=tmp;
}
int ans=;
for(int i=;i<=;++i) ans=max(ans,f[i]);
cout<<ans;
}
4300: 绝世好题
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 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