P4310 绝世好题
题意:
给定一个长度为 \(n\) 的数列 \(a_i\),求 \(a_i\) 的子序列 \(b_i\) 的最长长度 \(k\),满足 \(b_i \& b_{i-1} \ne 0\),其中 $2 \le i \le k $ ,& 表示位运算取与。
数据范围:
$ 1 \le n \le 100000 ,a_i \le 10 ^ 9$
思路:
定义 \(f[i]:\) 为 \(b_j \& b _{j - 1}\) 在第 \(i\) 位上为 \(1\) 的最长长度。
实现:
#include <algorithm>
#include <stdio.h>
#include <cstring>
using namespace std;
int f[35] = {0};
int main()
{
int n, res = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
int tt = 0;
for (int j = 0; j < 31; j++)
if ((x >> j) & 1)
tt = max(tt, f[j]);
for (int j = 0; j < 31; j++)
if ((x >> j) & 1)
{
f[j] = tt + 1;
res = max(res, f[j]);
}
}
printf("%d\n", res);
return 0;
}
标签:绝世,int,res,好题,P4310,le,include
From: https://www.cnblogs.com/zxr000/p/17004763.html