牛客 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;
}