A. The Brand New Function
题目大意
Polycarpus有一个由n个非负整数组成的序列。 我们定义函数
f(l,r)(1≤l,r≤n)
,表示序列的子串[l,r]各项的“或”和:
al|al+1|⋯|ar
。 Polycarpus在纸上写下了所有的
f(l,r)
的值,他想知道他写下了多少个不同的值。
输入
第一行1个整数
n(1≤n≤105)
,表示序列a的元素个数。 第二行n个整数,表示序列各项元素
ai(0≤ai≤106)
。
输出
输出
f(l,r)
有多少个不同的值。
样例
3 1 2 0
output
4
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;
}