Advertisement
Josif_tepe

Untitled

Dec 8th, 2024
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <unordered_map>
  5. #include <queue>
  6. using namespace std;
  7. const short max_size = 1000;
  8. short n;
  9. vector<string> words;
  10. unordered_map<string, short> mapa;
  11. short cnt_words(const vector<string> & c) {
  12.     short res = 0;
  13.     unordered_map<string, short> cnt_map;
  14.     for(short i = 0; i < n; i++) {
  15.         string s = "";
  16.         for(short j = 0; j < n; j++) {
  17.             s += c[i][j];
  18.         }
  19.         cnt_map[s]++;
  20.     }
  21.     for(short j = 0; j < n; j++) {
  22.         string s = "";
  23.         for(short i = 0; i < n; i++) {
  24.             s += c[i][j];
  25.         }
  26.        
  27.         cnt_map[s]++;
  28.     }
  29.     for(pair<string, short> p : mapa) {
  30.         res += min(p.second, cnt_map[p.first]);
  31.     }
  32.     return res;
  33. }
  34. int main()
  35. {
  36.     ios_base::sync_with_stdio(false);
  37.     short k;
  38.     cin >> n >> k;
  39.    
  40.     for(short i = 0; i < k; i++) {
  41.         string s;
  42.         cin >> s;
  43.         words.push_back(s);
  44.         mapa[s]++;
  45.     }
  46.    
  47.     map<vector<string>, bool> map_visited;
  48.     vector<string> v(n);
  49.     string S = "";
  50.     for(int i = 0; i < n; i++) {
  51.         S += ".";
  52.     }
  53.     for(int i = 0; i < n; i++) {
  54.         v[i] = S;
  55.     }
  56.     queue<vector<string>> q;
  57.     queue<short> q_vis;
  58.     q_vis.push(0);
  59.     q.push(v);
  60.    
  61.     short res = 0;
  62.     vector<string> tmp;
  63.     while(!q.empty()) {
  64.         vector<string> c = q.front();
  65.         q.pop();
  66.         short visited = q_vis.front();
  67.         q_vis.pop();
  68.        
  69.        
  70.         short cnt = 0;
  71.         for(short i = 0; i < n; i++) {
  72.             for(short j = 0; j < n; j++) {
  73.                 if(c[i][j] == '.') {
  74.                     cnt++;
  75.                     break;
  76.                 }
  77.             }
  78.             if(cnt > 0) {
  79.                 break;
  80.             }
  81.         }
  82.        
  83.         if(cnt == 0 and cnt_words(c) >= 2 * n) {
  84.             res++;
  85. //            for(short i = 0;i < n; i++) {
  86. //                for(short j = 0; j < n; j++) {
  87. //                    cout << c[i][j];
  88. //                }
  89. //                cout << endl;
  90. //            }
  91. //            cout << endl;
  92.             continue;
  93.         }
  94.         if(cnt == 0) {
  95.             continue;
  96.         }
  97.        
  98.         for(short w = 0; w < k; w++) {
  99.             if(!(visited & (1 << w))) {
  100.                 for(short i = 0; i < n; i++) {
  101.                     bool check = true;
  102.  
  103.                     for(short j = 0; j < n; j++) {
  104.                         if(c[i][j] != '.' and c[i][j] != words[w][j]) {
  105.                             check = false;
  106.                             break;
  107.                         }
  108.                     }
  109.                     if(check) {
  110.                          tmp = c;
  111.                         for(short j = 0; j < n; j++) {
  112.                             tmp[i][j] = words[w][j];
  113.                         }
  114.                         if(!map_visited[tmp]) {
  115.                             q.push(tmp);
  116.                             q_vis.push(visited | (1 << w));
  117.                             map_visited[tmp] = true;
  118.                         }
  119.                     }
  120.                 }
  121.                 for(short j = 0; j < n; j++) {
  122.                     bool check = true;
  123.                     for(short i = 0; i < n; i++) {
  124.                         if(c[i][j] != '.' and words[w][i] != c[i][j]) {
  125.                             check = false;
  126.                             break;
  127.                         }
  128.                     }
  129.                     if(check) {
  130.                          tmp = c;
  131.                         for(short i = 0; i < n; i++) {
  132.                             tmp[i][j] = words[w][i];
  133.                         }
  134.                        
  135.                         if(!map_visited[tmp]) {
  136.                             map_visited[tmp] = true;
  137.                             q.push(tmp);
  138.                             q_vis.push(visited | (1 << w));
  139.                            
  140.                         }
  141.                     }
  142.                    
  143.                    
  144.                 }
  145.             }
  146.         }
  147.        
  148.        
  149.     }
  150.     cout << res << endl;
  151.     return 0;
  152.  
  153. }
  154.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement