您的位置:首页 > 其它

Codeforces Round #150 (Div. 1) A

2015-04-24 20:29 337 查看
//开一个数组存入当前位置二进制位每一位的最后一个位置

//处理到第i位时,让第i位数与前面的每一位的最后一位置从大到小取或

#include<cstdio>

#include<cstring>

#include<iostream>

#include<algorithm>

using namespace std ;

const int maxn = 100010 ;

const int inf = (1<<20) + 100 ;

int a[maxn] ;

int a_pos[32] ;

int b_pos[maxn] ;

int vis[inf] ;

int solve(int n ,int pos)

{

int t = 0;

for(int i = 0;i <=20 ;i++)

{

if(((n&(1<<i)) == 0)&&(a_pos[i]!=0))

b_pos[t++] = a_pos[i] ;

else if((n&(1<<i))) a_pos[i] = pos ;

}

return t ;

}

int main()

{

//freopen("input.txt" ,"r",stdin);

int n ;

while(~scanf("%d" ,&n))

{

memset(vis , 0 , sizeof(vis)) ;

memset(a_pos , 0 ,sizeof(a_pos)) ;

for(int i = 1;i <= n;i++)

{

scanf("%d" ,&a[i]) ;

int sum = solve(a[i] , i);

if(sum!=0)

sort(b_pos , b_pos+sum) ;

int t = a[i] ;vis[t] = 1;

for(int j = sum - 1;j >= 0;j--)

t|=a[b_pos[j]] , vis[t] = 1 ;

}

int ans = 0 ;

for(int i = 0;i < inf ;i++)

if(vis[i])

ans++ ;

printf("%d\n" ,ans) ;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: