1. 程式人生 > >HDU - 3006 The Number of set(狀態壓縮位運算)

HDU - 3006 The Number of set(狀態壓縮位運算)

memset scl 所有 targe oid print push out queue

http://acm.hdu.edu.cn/showproblem.php?pid=3006

題意

給定n個集合,每個集合都是由大於等於1小於等於m的數字組成,m最大為14。問由給出的集合可以組成多少個不同的集合。

分析

因為m最大為14位,那麽可以把一個集合壓縮成一個數,每個元素對應二進制的一個位。所有狀態最大為(1<<m)。用個數組記錄出現的狀態,用map實測超時。

#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include
<vector> #include<cstdio> #include<algorithm> #include<map> #include<set> #include<bitset> #define rep(i,e) for(int i=0;i<(e);i++) #define rep1(i,e) for(int i=1;i<=(e);i++) #define repx(i,x,e) for(int i=(x);i<=(e);i++) #define X first #define Y second #define
PB push_back #define MP make_pair #define mset(var,val) memset(var,val,sizeof(var)) #define scd(a) scanf("%d",&a) #define scdd(a,b) scanf("%d%d",&a,&b) #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c) #define pd(a) printf("%d\n",a) #define scl(a) scanf("%lld",&a) #define
scll(a,b) scanf("%lld%lld",&a,&b) #define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c) #define IOS ios::sync_with_stdio(false);cin.tie(0) using namespace std; typedef long long ll; template <class T> void test(T a){cout<<a<<endl;} template <class T,class T2> void test(T a,T2 b){cout<<a<<" "<<b<<endl;} template <class T,class T2,class T3> void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;} const int N = 1e6+10; //const int MAXN = 210; const int inf = 0x3f3f3f3f; const ll INF = 0x3f3f3f3f3f3f3f3fll; const ll mod = 1000000007; int T; void testcase(){ printf("Case #%d: ",++T); } const int MAXN = 100+5; const int MAXM = 5e5+5; int ma[MAXM]; int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL int n,m,x,y,value; while(~scdd(n,m)){ mset(ma,0); int ans=0; for(int i=0;i<n;i++){ scd(x); value=0; for(int j=0;j<x;j++){ scd(y); value+=(1<<(y-1)); } ma[value]=1; for(int j=1;j <= (1<<m) ;j++){ if(ma[j]){ ma[j|value]=1; } } } for(int i=1;i<=(1<<m);i++) if(ma[i]) ans++; cout<<ans<<endl; } return 0; }

HDU - 3006 The Number of set(狀態壓縮位運算)