CodeForces 243A|The Brand New Function|位运算

A. The Brand New Function

题目大意

Polycarpus有一个由n个非负整数组成的序列。
我们定义函数 f(l,r)(1l,rn) ,表示序列的子串[l,r]各项的“或”和: al|al+1||ar
Polycarpus在纸上写下了所有的 f(l,r) 的值,他想知道他写下了多少个不同的值。

输入

第一行1个整数 n(1n105) ,表示序列a的元素个数。
第二行n个整数,表示序列各项元素 ai(0ai106)

输出

输出 f(l,r) 有多少个不同的值。

样例

input

3
1 2 0

output

4

input

10
1 2 3 4 5 6 1 2 9 10

output

11

Note

第一个样例中:6个 f(l,r) 分别为: f(1,1)=1,f(1,2)=3,f(1,3)=3,f(2,2)=2,f(2,3)=2,f(3,3)=0 。有4种不同的值:0, 1, 2, 3.

代码

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <functional>
#include <utility>
typedef long long ll;
const int inf = 0x7ffffff;
#define FILENAME "or"
#define FOR(i,j,k) for(i=j;i<=k;++i)
#define rep(i,j,k) for(i=j;i<k;++i)
#define mem(i,j) memset(i,j,sizeof(i))
#define forEach(i,j) for(typeof(j.begin()) i=j.begin();i!=j.end();++i)

int read() {
    int f = 1, s = 0; char ch = getchar();
    for ( ; ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') f = -1;
    for ( ; '0' <= ch && ch <= '9'; ch = getchar()) s = s * 10 + ch - '0';
    return s * f;
}

namespace Solve {
    const int N = 100005;
    int mark[1<<20], a[N];
    void solve() {
        int n = read(), i, x, y, j, ans = 0;
        FOR(i,1,n) a[i] = read();
        FOR(i,1,n) {
            x = 0;
            if (!mark[a[i]])
                mark[a[i]] = 1, ++ans;
            for (j = i - 1; j; --j) {
                x |= a[j];
                if (!mark[x | a[i]])
                    mark[x | a[i]] = 1, ++ans;
                if ((x | a[i]) == x) break;
            }
        }
        printf("%d", ans);
    }
}

int main() {
    freopen(FILENAME".in","r",stdin);
    freopen(FILENAME".out","w",stdout);
    Solve::solve();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值