Advertisement
scottish_esquire

Задача № 1. Кубики

Oct 20th, 2022 (edited)
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_set>
  4.  
  5.  
  6. // Задача № 1. Кубики
  7. // Дано n кубиков, у каждого из них 6 граней, на каждой гране написана какая-то буква и слово s. Слово s можно составить, если каждой букве слова s сопоставить уникальный кубик, так чтобы мы могли повернуть этот кубик и получить нужную нам букву. Задача найти самое длинное возможное подслово s, то есть поставить как можно больше кубиков на соответствующие места. Если таких подслов несколько, то любое из них.
  8. // Пример — даны три кубика, на гранях которых написаны буквы:
  9. // (a, a, a, a, a, a)
  10. // (a, a, a, a, a, b)
  11. // (a, a, a, b, b, c)
  12. // (a, a, a, a, a, a)
  13. // Тогда самое длинное слово «acbb», получается из кубиков: 132.
  14.  
  15. // Примеры
  16.  
  17. // входные данные
  18.  
  19. // acbb
  20. // 4
  21. // aaaaaa
  22. // aaaaab
  23. // aaabbc
  24. // aaaaaa
  25.  
  26. // выходные данные
  27. // 1 3 2
  28.  
  29. int n, k;
  30. std::vector <std::vector<int>> g;
  31. std::vector<int> mt;
  32. std::vector<bool> used;
  33.  
  34. bool try_kuhn (int v) {
  35.     if (used[v])  return false;
  36.     used[v] = true;
  37.     for (size_t i=0; i<g[v].size(); ++i) {
  38.         int to = g[v][i];
  39.         if (mt[to] == -1 || try_kuhn (mt[to])) {
  40.             mt[to] = v;
  41.             return true;
  42.         }
  43.     }
  44.     return false;
  45. }
  46.  
  47. int main() {
  48.     int a;
  49.     std::string s;
  50.     std::string c;
  51.     int d = 0;
  52.     std::cin >> s;
  53.     std::cin >> a;
  54.     k = s.size();
  55.     n = a;
  56.     g = std::vector<std::vector<int>> (a);
  57.     for (int i = 0; i < a; i++) {
  58.         std::unordered_set<char> m;
  59.         std::cin >> c;
  60.         for (int j = 0; j < 6; j++) {
  61.             if (s.find(c[j]) != std::string::npos) {
  62.                 m.insert(c[j]);
  63.             }
  64.         }
  65.         for (int j = 0; j < s.size(); j++) {
  66.             if (m.find(s[j]) != m.end()) {
  67.                 g[i].push_back(j);
  68.             }
  69.         }
  70.         m.clear();
  71.     }
  72.     mt.assign (k, -1);
  73.     std::vector<bool> used1(n);
  74.     for (int i = 0; i < n; ++i)
  75.         for (size_t j = 0; j < g[i].size(); ++j)
  76.             if (mt[g[i][j]] == -1) {
  77.                 mt[g[i][j]] = i;
  78.                 used1[i] = true;
  79.                 break;
  80.             }
  81.     for (int i=0; i<n; ++i) {
  82.         if (used1[i])  continue;
  83.         used.assign (n, false);
  84.         try_kuhn (i);
  85.     }
  86.     for (int i=0; i<k; ++i) {
  87.         if (mt[i] != -1) {
  88.             std::cout << mt[i]+1 << " ";
  89.         }
  90.     }
  91. }
  92.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement