就是一个 位运算状态表示的题 以为很水的啊... 自己写出来的一直 WA 和别人AC的对拍 几组test也都是对的
我也是醉了
//我WA的
1 #include <iostream> 2 #include <cstring> 3 #include <set> 4 using namespace std; 5 6 int n; 7 set<int>s; 8 int bit[16]; 9 10 void dfs( int Id , int ans ) 11 { 12 s.insert( ans ); 13 if( Id==n-1 ) 14 { 15 return ; 16 } 17 for( int i = Id+1 ; i<=n-1 ; i++ ) 18 { 19 dfs( i , ans|bit[i] ); 20 } 21 } 22 23 int main() 24 { 25 cin.sync_with_stdio(false); 26 int m , k , num; 27 while( cin >> n >> m ) 28 { 29 s.clear(); 30 memset( bit , 0 , sizeof(bit) ); 31 for( int i = 0 ; i<n ; i++ ) 32 { 33 cin >> k; 34 for( int j = 0 ; j<k ; j++ ) 35 { 36 cin >> num; 37 bit[i] |= (1<<num); 38 } 39 s.insert( bit[i] ); 40 } 41 for( int i = 0 ; i<n ; i++ ) 42 { 43 dfs( i , bit[i] ); 44 } 45 cout << s.size( ) << endl; 46 } 47 return 0; 48 }
//AC的
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 bool bit[(1<<16)]; 6 7 int main() 8 { 9 int n , m , k , temp , num , ans; 10 while( cin >> n >> m ) 11 { 12 ans = 0; 13 memset( bit , false , sizeof(bit) ); 14 for( int i = 0 ; i<n ; i++ ) 15 { 16 cin >> k ; 17 temp = 0; 18 for( int j = 0 ; j<k ; j++ ) 19 { 20 cin >> num; 21 temp |= (1<<num); 22 } 23 bit[temp] = true; 24 for( int j = 1 ; j<( 1<<(m+1) ); j++ ) 25 { 26 if( bit[j] ) 27 { 28 bit[ temp|j ] = true; 29 } 30 } 31 } 32 for( int i = 1 ; i<( 1<<(m+1) ) ; i++ ) 33 { 34 if( bit[i] ) 35 { 36 ++ ans; 37 } 38 } 39 cout << ans << endl; 40 } 41 return 0; 42 }
觉得 差不多. =_=