牛客 NC15810 求值

牛客 NC15810 求值

给定n个数字a1, a2, …, an。
定义f(l, r) = al | al+1| … | ar。
现在枚举(1 <= l <= r <= n),问不同的f值一共有多少个。

#include <stdio.h>
#include <string.h>

#define N 2000000
int cnt[N];//用来记录或的值是否出现

typedef struct _sz
{
    int a[N];
    int len;
}SZ;

void initial(SZ* s)//初始化数组为0
{
    memset(s->a, 0, sizeof(s->a));
    s->len = 0;
}

void clear(SZ* s)//将当前数组长度初始为0
{
    s->len = 0;
}

int find(SZ* s, int x)//查找或的值是否出现过
{
    for(int i = 0; i < s->len; ++i)
    {
        if(s->a[i] == x)
            return x;
    }
    return -1;
}

void insert(SZ* s, int x)//将或的值添加进数组
{
    s->a[s->len] = x;
    s->len += 1;
}

int main(void)
{
    int n, y, x, flag = 0, count = 0;
    scanf("%d", &n);
    SZ str[2];
    initial(&str[0]);//初始化
    initial(&str[1]);
    for(int i = 1; i <= n; ++i)
    {
        scanf("%d", &y);
        flag = 1-flag;//交替数组
        clear(&str[flag]);
        for(int j = 0; j < str[1-flag].len; ++j)
        {
            x = str[1-flag].a[j] | y;
            cnt[x] = 1;//标记所出现或的值
            if(find(&str[flag], x) == -1)//若或的值不存在与数组,则添加入数组
                insert(&str[flag], x);
        }
        insert(&str[flag], y);//每个输入的值都添加入数组
        cnt[y] = 1;//标记所出现或的值,l=r的情况
    }
    
    for(int i = 0; i < N; ++i)
    {
        if(cnt[i] != 0)//记录所出现所有或的次数
            count++;
    }
    printf("%d", count);
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值