题目大意:
链接:https://www.nowcoder.com/acm/contest/84/E
给定n个数字a1, a2, ..., an。
定义f(l, r) = al | al+1| ... | ar。
现在枚举(1 <= l <= r <= n),问不同的f值一共有多少个。
思路:确定一个 l 的情况下, 从 l 出发的的不同值最多只有20多个, 从后往前暴力更新就好啦。
1 #include<bits/stdc++.h> 2 #define LL long long 3 #define pii pair<int,int> 4 #define mk make_pair 5 #define fi first 6 #define se second 7 using namespace std; 8 9 const int N=1e5+7; 10 const int M=2e6+7; 11 const int inf=0x3f3f3f3f; 12 const LL INF=0x3f3f3f3f3f3f3f3f; 13 const int mod=1e9+7; 14 15 int n, a[N], ans; 16 bool vis[M]; 17 set<int> st; 18 vector<int> v[N]; 19 int main() { 20 scanf("%d", &n); 21 for(int i = 1; i <= n; i++) 22 scanf("%d", &a[i]); 23 vis[a[n]] = true; 24 v[n].push_back(a[n]); 25 ans++; 26 for(int i = n - 1; i >= 1; i--) { 27 if(!vis[a[i]]) { 28 vis[a[i]] = true; 29 ans++; 30 } 31 st.insert(a[i]); 32 for(int u : v[i + 1]) { 33 if(!vis[a[i] | u]) { 34 vis[a[i] | u] = true; 35 ans++; 36 } 37 st.insert(a[i] | u); 38 } 39 40 for(int u : st) 41 v[i].push_back(u); 42 st.clear(); 43 } 44 printf("%d ", ans); 45 return 0; 46 } 47 /* 48 */