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

Sample Output

2

HINT

n<=100000,ai<=2*10^9

04-05 15:28