题目描述
The FZU Code Carnival is a programming competetion hosted by the ACM-ICPC Training Center of Fuzhou University. The activity mainly includes the programming contest like ACM-ICPC and strive to provide participants with interesting code challenges in the future.
Before the competition begins, YellowStar wants to know which teams are likely to be winners. YellowStar counted the skills of each team, including data structure, dynamic programming, graph theory, etc. In order to simplify the forecasting model, YellowStar only lists M skills and the skills mastered by each team are represented by a 01 sequence of length M. 1 means that the team has mastered this skill, and 0 does not.
If a team is weaker than other teams, this team cannot be a winner. Otherwise, YellowStar thinks the team may win. Team A(a1, a2, …, aM ) is weaker than team B(b1, b2, …, bM ) if ∀i ∈ [1, M], ai ≤ bi and ∃i ∈ [1, M], ai < bi.
Since YellowStar is busy preparing for the FZU Code Carnival recently, he dosen’t have time to forecast which team will be the winner in the N teams. So he asks you to write a program to calculate the number of teams that might be winners.
输入
Input is given from Standard Input in the following format:
N M
s1 s2 . . . sN
The binary representation of si indicates the skills mastered by teami.
Constraints
1 ≤ N ≤ 2 × 106
1 ≤ M ≤ 20
0 ≤ si < 2M
输出
Print one line denotes the answer.
样例输入
3 3
2 5 6
样例输出
2
思路
记录整个序列的最大值,从这个最大值往下找,如果存在比其弱的队伍,就标记,答案为所有没有被标记的队伍的总和
代码实现
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long LL;
int n,m;
int dp[1<<(20)+5];
int maxn,ans;
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
int temp;
scanf("%d",&temp);
dp[temp]++;
maxn=max(maxn,temp);
}
for(int i=maxn;i>=0;i--)
{
if(dp[i]!=0)
{
if(dp[i]>0) ans+=dp[i];
for(int j=m-1;j>=0;j--)
{
if(i&(1<<j)) dp[i^(1<<j)]=-1;
}
}
}
printf("%d\n",ans)
return 0;
}