Dang_Quan_10_Tin

D

Jul 21st, 2020
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <array>
  4. #define task "tests"
  5. using namespace std;
  6. using ll = long long;
  7. using ld = long double;
  8.  
  9. const int N = 1 << 20 + 2;
  10. const int Inf = 1e9 + 7;
  11. int k, n;
  12. int a[N];
  13. int all;
  14. int par[N];
  15. int dp[N], g[N];
  16.  
  17. void Read(){
  18.     cin >> k >> n;
  19.     for(int i = 1; i <= n; ++i){
  20.         string s;
  21.         cin >> s;
  22.         a[i] = 0;
  23.         for(int j = 0; j < k; ++j)
  24.             if(s[j] == '0')
  25.                 a[i] |= 1 << j;
  26.         ++g[a[i]];
  27.     }
  28. }
  29.  
  30. void Calculate_g(){
  31.     all = (1 << k) - 1;
  32.     for(int i = 0; i <= all; ++i)
  33.         dp[i] = Inf,
  34.         par[i] = -1;
  35.     for(int j = 0; j < k; ++j)
  36.         for(int i = 0; i < (1 << k); ++i)
  37.             if(i & (1 << j))
  38.                 g[i] += g[i ^ (1 << j)];
  39. }
  40.  
  41. void Trace(int v){
  42.     if(par[v] == -1)
  43.         return;
  44.     Trace(par[v]);
  45.     int vv = (v ^ par[v]), lv = 0;
  46.     while(vv > 1){
  47.         ++lv;
  48.         vv >>= 1;
  49.     }
  50.     cout << lv + 1 << " ";
  51. }
  52.  
  53. void Solve(){
  54.     dp[0] = 0;
  55.     for(int i = 1; i < (1 << k); ++i)
  56.         for(int j = 0; j < k; ++j)
  57.             if(i & (1 << j))
  58.                 if(dp[i] >= dp[i ^ (1 << j)] + g[all ^ (i ^ (1 << j))]){
  59.                     dp[i] = dp[i ^ (1 << j)] + g[all ^ (i ^ (1 << j))];
  60.                     par[i] = i ^ (1 << j);
  61.                 }
  62.     cout << dp[(1 << k) - 1] << "\n";
  63.     Trace((1 << k) - 1);
  64. }
  65.  
  66. main(){
  67.     ios::sync_with_stdio(0);
  68.     cin.tie(0);
  69.     cout.tie(0); if(fopen(task".IN", "r"))
  70.     freopen(task".IN", "r", stdin);
  71.     int t;
  72.     cin >> t;
  73.     while(t--)
  74.         Read(),
  75.         Calculate_g(),
  76.         Solve();
  77. }
Advertisement
Add Comment
Please, Sign In to add comment