#include<bits/stdc++.h> using namespace std; typedef long long ll; constexpr int MOD = 1000000007; constexpr int n_max = 1000; ll ways[n_max+1][3] = {}; int getCzerwone(int niebieskie, int shift) { int result = (niebieskie + shift) / 2 % 3; if (result < 0) result += 3; return result; } ll solve(int czerwone, int zielone, int niebieskie, int czcz) { int wszystkie = czerwone + zielone + niebieskie; int shift = czerwone - zielone; if (wszystkie == 1) { if (niebieskie == 0) return 1; else return 2; } ll result; if (wszystkie % 2 == 0) result = ways[niebieskie][getCzerwone(niebieskie, (2-shift) % 6)] + ways[niebieskie][getCzerwone(niebieskie, (4-shift) % 6)]; else { result = ways[niebieskie][getCzerwone(niebieskie, (1-shift) % 6)] + ways[niebieskie][getCzerwone(niebieskie, (5-shift) % 6)]; if (czerwone == 0 && zielone == 0) result -= 2; else if (czcz == czerwone + zielone || czcz == 0) result--; } return result % MOD; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; string str; cin >> str; ways[0][0] = 1; for (int i = 1; i <= n; i++) for (int s = 0; s < 3; s++) { ways[i][s] = ways[i-1][s-1 == -1 ? 2 : s-1] + ways[i-1][s]; //if (ways[i][s] >= MOD) // ways[i][s] -= MOD; ways[i][s] %= MOD; } /* for (int i = 0; i <= n; i++) { cout << i << " :\t"; for (int s = 0; s < 6; s++) cout << ways[i][s] << "\t"; cout << endl; } */ int czerwone = 0, zielone = 0, niebieskie = 0; int czcz = 0; // ile na dobrym miejscu dla wzoru "czczcz..." for (int i = 0; i < (int)str.size(); i++) { if (str[i] == 'C') czerwone++; if (str[i] == 'Z') zielone++; if (str[i] == 'N') niebieskie++; if ((i % 2 == 0 && str[i] == 'C') || (i % 2 == 1 && str[i] == 'Z')) czcz++; } cout << solve(czerwone, zielone, niebieskie, czcz) << "\n"; while (q--) { int idx; char color; cin >> idx >> color; idx--; if (str[idx] == 'C') czerwone--; if (str[idx] == 'Z') zielone--; if (str[idx] == 'N') niebieskie--; if ((idx % 2 == 0 && str[idx] == 'C') || (idx % 2 == 1 && str[idx] == 'Z')) czcz--; if (color == 'C') czerwone++; if (color == 'Z') zielone++; if (color == 'N') niebieskie++; if ((idx % 2 == 0 && color == 'C') || (idx % 2 == 1 && color == 'Z')) czcz++; str[idx] = color; cout << solve(czerwone, zielone, niebieskie, czcz) << "\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 110 111 112 113 114 115 116 117 118 119 120 | #include<bits/stdc++.h> using namespace std; typedef long long ll; constexpr int MOD = 1000000007; constexpr int n_max = 1000; ll ways[n_max+1][3] = {}; int getCzerwone(int niebieskie, int shift) { int result = (niebieskie + shift) / 2 % 3; if (result < 0) result += 3; return result; } ll solve(int czerwone, int zielone, int niebieskie, int czcz) { int wszystkie = czerwone + zielone + niebieskie; int shift = czerwone - zielone; if (wszystkie == 1) { if (niebieskie == 0) return 1; else return 2; } ll result; if (wszystkie % 2 == 0) result = ways[niebieskie][getCzerwone(niebieskie, (2-shift) % 6)] + ways[niebieskie][getCzerwone(niebieskie, (4-shift) % 6)]; else { result = ways[niebieskie][getCzerwone(niebieskie, (1-shift) % 6)] + ways[niebieskie][getCzerwone(niebieskie, (5-shift) % 6)]; if (czerwone == 0 && zielone == 0) result -= 2; else if (czcz == czerwone + zielone || czcz == 0) result--; } return result % MOD; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; string str; cin >> str; ways[0][0] = 1; for (int i = 1; i <= n; i++) for (int s = 0; s < 3; s++) { ways[i][s] = ways[i-1][s-1 == -1 ? 2 : s-1] + ways[i-1][s]; //if (ways[i][s] >= MOD) // ways[i][s] -= MOD; ways[i][s] %= MOD; } /* for (int i = 0; i <= n; i++) { cout << i << " :\t"; for (int s = 0; s < 6; s++) cout << ways[i][s] << "\t"; cout << endl; } */ int czerwone = 0, zielone = 0, niebieskie = 0; int czcz = 0; // ile na dobrym miejscu dla wzoru "czczcz..." for (int i = 0; i < (int)str.size(); i++) { if (str[i] == 'C') czerwone++; if (str[i] == 'Z') zielone++; if (str[i] == 'N') niebieskie++; if ((i % 2 == 0 && str[i] == 'C') || (i % 2 == 1 && str[i] == 'Z')) czcz++; } cout << solve(czerwone, zielone, niebieskie, czcz) << "\n"; while (q--) { int idx; char color; cin >> idx >> color; idx--; if (str[idx] == 'C') czerwone--; if (str[idx] == 'Z') zielone--; if (str[idx] == 'N') niebieskie--; if ((idx % 2 == 0 && str[idx] == 'C') || (idx % 2 == 1 && str[idx] == 'Z')) czcz--; if (color == 'C') czerwone++; if (color == 'Z') zielone++; if (color == 'N') niebieskie++; if ((idx % 2 == 0 && color == 'C') || (idx % 2 == 1 && color == 'Z')) czcz++; str[idx] = color; cout << solve(czerwone, zielone, niebieskie, czcz) << "\n"; } } |