#include <iostream> #include <vector> #include <utility> #include <memory> namespace { using std::ios_base, std::cin, std::cout; using std::vector, std::pair, std::unique_ptr, std::make_unique; using bulbs_t = vector<bool>; using switch_t = pair<size_t, size_t>; using v_switches_t = vector<switch_t>; using v_switch_idx_t = vector<size_t>; constexpr size_t MOD = 1000000007; struct Node { unique_ptr<Node> zero; unique_ptr<Node> one; }; using trie_t = unique_ptr<Node>; v_switches_t switches; trie_t trie; bulbs_t bulbs; bool insert_bulbs(trie_t const & trie, bulbs_t const & bulbs, size_t idx = 0) { bool result = false; if (trie && idx < bulbs.size()) { if (bulbs[idx]) { if (!trie->one) { trie->one = make_unique<Node>(); result = true; } if (idx < bulbs.size() - 1) result = insert_bulbs(trie->one, bulbs, idx + 1); } else { if (!trie->zero) { trie->zero = make_unique<Node>(); result = true; } if (idx < bulbs.size() - 1) result = insert_bulbs(trie->zero, bulbs, idx + 1); } } return result; } size_t configs_number(v_switch_idx_t & parents) { size_t num = 1; for (size_t idx = 0; idx < switches.size(); ++idx) { if (parents.size() == 0 || switches[parents.back()] != switches[idx]) if (bulbs[switches[idx].first] == bulbs[switches[idx].second]) { bulbs[switches[idx].first] = !bulbs[switches[idx].first]; bulbs[switches[idx].second] = bulbs[switches[idx].first]; if (insert_bulbs(trie, bulbs)) { size_t parents_size = parents.size(), prev_parent; if (parents_size == 0) { parents.push_back(idx); } else { prev_parent = parents[0]; parents[0] = idx; } num += configs_number(parents); if (num >= MOD) num -= MOD; if (parents_size == 0) parents.pop_back(); else parents[0] = prev_parent; } bulbs[switches[idx].first] = !bulbs[switches[idx].first]; bulbs[switches[idx].second] = bulbs[switches[idx].first]; } } return num; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); size_t n, m; cin >> n; cin >> m; size_t ci; for (size_t i = 0; i < n; ++i) { cin >> ci; if (ci == 1) bulbs.push_back(true); else bulbs.push_back(false); } size_t ai, bi; for (size_t i = 0; i < m; ++i) { cin >> ai; cin >> bi; switches.emplace_back(ai - 1, bi - 1); } size_t result = 1; v_switch_idx_t parents; if (n > 1) { trie = make_unique<Node>(); insert_bulbs(trie, bulbs); result = configs_number(parents); } std::cout << result << '\n'; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include <iostream> #include <vector> #include <utility> #include <memory> namespace { using std::ios_base, std::cin, std::cout; using std::vector, std::pair, std::unique_ptr, std::make_unique; using bulbs_t = vector<bool>; using switch_t = pair<size_t, size_t>; using v_switches_t = vector<switch_t>; using v_switch_idx_t = vector<size_t>; constexpr size_t MOD = 1000000007; struct Node { unique_ptr<Node> zero; unique_ptr<Node> one; }; using trie_t = unique_ptr<Node>; v_switches_t switches; trie_t trie; bulbs_t bulbs; bool insert_bulbs(trie_t const & trie, bulbs_t const & bulbs, size_t idx = 0) { bool result = false; if (trie && idx < bulbs.size()) { if (bulbs[idx]) { if (!trie->one) { trie->one = make_unique<Node>(); result = true; } if (idx < bulbs.size() - 1) result = insert_bulbs(trie->one, bulbs, idx + 1); } else { if (!trie->zero) { trie->zero = make_unique<Node>(); result = true; } if (idx < bulbs.size() - 1) result = insert_bulbs(trie->zero, bulbs, idx + 1); } } return result; } size_t configs_number(v_switch_idx_t & parents) { size_t num = 1; for (size_t idx = 0; idx < switches.size(); ++idx) { if (parents.size() == 0 || switches[parents.back()] != switches[idx]) if (bulbs[switches[idx].first] == bulbs[switches[idx].second]) { bulbs[switches[idx].first] = !bulbs[switches[idx].first]; bulbs[switches[idx].second] = bulbs[switches[idx].first]; if (insert_bulbs(trie, bulbs)) { size_t parents_size = parents.size(), prev_parent; if (parents_size == 0) { parents.push_back(idx); } else { prev_parent = parents[0]; parents[0] = idx; } num += configs_number(parents); if (num >= MOD) num -= MOD; if (parents_size == 0) parents.pop_back(); else parents[0] = prev_parent; } bulbs[switches[idx].first] = !bulbs[switches[idx].first]; bulbs[switches[idx].second] = bulbs[switches[idx].first]; } } return num; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); size_t n, m; cin >> n; cin >> m; size_t ci; for (size_t i = 0; i < n; ++i) { cin >> ci; if (ci == 1) bulbs.push_back(true); else bulbs.push_back(false); } size_t ai, bi; for (size_t i = 0; i < m; ++i) { cin >> ai; cin >> bi; switches.emplace_back(ai - 1, bi - 1); } size_t result = 1; v_switch_idx_t parents; if (n > 1) { trie = make_unique<Node>(); insert_bulbs(trie, bulbs); result = configs_number(parents); } std::cout << result << '\n'; } |