Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <unordered_set>
- // Задача № 1. Кубики
- // Дано n кубиков, у каждого из них 6 граней, на каждой гране написана какая-то буква и слово s. Слово s можно составить, если каждой букве слова s сопоставить уникальный кубик, так чтобы мы могли повернуть этот кубик и получить нужную нам букву. Задача найти самое длинное возможное подслово s, то есть поставить как можно больше кубиков на соответствующие места. Если таких подслов несколько, то любое из них.
- // Пример — даны три кубика, на гранях которых написаны буквы:
- // (a, a, a, a, a, a)
- // (a, a, a, a, a, b)
- // (a, a, a, b, b, c)
- // (a, a, a, a, a, a)
- // Тогда самое длинное слово «acbb», получается из кубиков: 132.
- // Примеры
- // входные данные
- // acbb
- // 4
- // aaaaaa
- // aaaaab
- // aaabbc
- // aaaaaa
- // выходные данные
- // 1 3 2
- int n, k;
- std::vector <std::vector<int>> g;
- std::vector<int> mt;
- std::vector<bool> used;
- bool try_kuhn (int v) {
- if (used[v]) return false;
- used[v] = true;
- for (size_t i=0; i<g[v].size(); ++i) {
- int to = g[v][i];
- if (mt[to] == -1 || try_kuhn (mt[to])) {
- mt[to] = v;
- return true;
- }
- }
- return false;
- }
- int main() {
- int a;
- std::string s;
- std::string c;
- int d = 0;
- std::cin >> s;
- std::cin >> a;
- k = s.size();
- n = a;
- g = std::vector<std::vector<int>> (a);
- for (int i = 0; i < a; i++) {
- std::unordered_set<char> m;
- std::cin >> c;
- for (int j = 0; j < 6; j++) {
- if (s.find(c[j]) != std::string::npos) {
- m.insert(c[j]);
- }
- }
- for (int j = 0; j < s.size(); j++) {
- if (m.find(s[j]) != m.end()) {
- g[i].push_back(j);
- }
- }
- m.clear();
- }
- mt.assign (k, -1);
- std::vector<bool> used1(n);
- for (int i = 0; i < n; ++i)
- for (size_t j = 0; j < g[i].size(); ++j)
- if (mt[g[i][j]] == -1) {
- mt[g[i][j]] = i;
- used1[i] = true;
- break;
- }
- for (int i=0; i<n; ++i) {
- if (used1[i]) continue;
- used.assign (n, false);
- try_kuhn (i);
- }
- for (int i=0; i<k; ++i) {
- if (mt[i] != -1) {
- std::cout << mt[i]+1 << " ";
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement