P4310 绝世好题

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;
}
posted @ 2022-12-25 22:17  zxr000  阅读(18)  评论(0编辑  收藏  举报