【BZOJ4300】绝世好题

                                         4300: 绝世好题

                                                 Time Limit: 1 Sec  Memory Limit: 128 MB
                                                          Submit: 2979  Solved: 1613

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

 

解析:

       最初只会O(N^2)。。。

       但是我们观察到,每往B中加进一个数,这个数只跟加进来前队尾的数有关,所以就可以枚举二进制上的每一位进行DP转移了,令f[i]为加入当前数后第i位为1的最大值。

 

代码:
 

#include 
using namespace std;

int n,ans;
int f[40];

inline int get_int()
{
	int x=0,f=1;
	char c;
	for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
	if(c=='-') f=-1,c=getchar();
	for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
	return x*f;
}

int main()
{
	scanf("%I64d",&n);
	for(int i=1;i<=n;++i)
	{
		int x=get_int(),tmp=0;
		for(int j=0;(1<

 

你可能感兴趣的:(普通线性DP,BZOJ)