#include<iostream> #include<string> using namespace std; const int N = 200005; const int MOD = 1000000007; long long tab[3][N]; long long calc(int r, int g, int b, int z0, int c0, int z1, int c1) { long long diff = abs(r - g); long long res = 0; if (b > 0) { for (int i = 0; i < 3; i++) { long long mod = (diff + i + b) % 3; if (mod != 0) { res += tab[i][b]; res %= MOD; if (mod == 1 && (r + g + b) % 2 == 1) { if (z0 == 0 && c1 == 0) { res = (res - 1) % MOD; } if (z1 == 0 && c0 == 0) { res = (res - 1) % MOD; } } } } } return res; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); // Pascal's triangle aggregated to mod 3 elems tab[0][1] = 1; tab[1][1] = 1; tab[2][1] = 0; for (int i = 2; i < N; i++) { tab[0][i] = (tab[0][i - 1] + tab[2][i - 1]) % MOD; tab[1][i] = (tab[1][i - 1] + tab[0][i - 1]) % MOD; tab[2][i] = (tab[2][i - 1] + tab[1][i - 1]) % MOD; } // Reading n, q, s int n, q; string s; cin >> n >> q >> s; // Counting how many reds, greens and blues we have int r = 0, g = 0, b = 0; for (int i = 0; i < n; i++){ if (s[i] == 'N') b++; else if (s[i] == 'C') r++; else g++; } // Counting how many greens and reds we have on even and odd indexes int z0 = 0, c0 = 0, z1 = 0, c1 = 0; for (int i = 0; i < n; i++) { if (i % 2 == 0) { if (s[i] == 'Z') z0++; else if (s[i] == 'C') c0++; } else { if (s[i] == 'Z') z1++; else if (s[i] == 'C') c1++; } } cout << calc(r, g, b, z0, c0, z1, c1) << '\n'; while (q--) { int pos; char c; cin >> pos >> c; pos--; // Update how many reds, greens and blues we have if (s[pos] == 'N') b--; else if (s[pos] == 'C') r--; else g--; if (c == 'N') b++; else if (c == 'C') r++; else g++; // Updating how many greens and reds we have on even and odd indexes if (pos % 2 == 0) { if (s[pos] == 'Z') z0--; if (s[pos] == 'C') c0--; if (c == 'Z') z0++; if (c == 'C') c0++; } else { if (s[pos] == 'Z') z1--; if (s[pos] == 'C') c1--; if (c == 'Z') z1++; if (c == 'C') c1++; } s[pos] = c; cout << calc(r, g, b, z0, c0, z1, c1) << '\n'; } cout << flush; return 0; }
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 | #include<iostream> #include<string> using namespace std; const int N = 200005; const int MOD = 1000000007; long long tab[3][N]; long long calc(int r, int g, int b, int z0, int c0, int z1, int c1) { long long diff = abs(r - g); long long res = 0; if (b > 0) { for (int i = 0; i < 3; i++) { long long mod = (diff + i + b) % 3; if (mod != 0) { res += tab[i][b]; res %= MOD; if (mod == 1 && (r + g + b) % 2 == 1) { if (z0 == 0 && c1 == 0) { res = (res - 1) % MOD; } if (z1 == 0 && c0 == 0) { res = (res - 1) % MOD; } } } } } return res; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); // Pascal's triangle aggregated to mod 3 elems tab[0][1] = 1; tab[1][1] = 1; tab[2][1] = 0; for (int i = 2; i < N; i++) { tab[0][i] = (tab[0][i - 1] + tab[2][i - 1]) % MOD; tab[1][i] = (tab[1][i - 1] + tab[0][i - 1]) % MOD; tab[2][i] = (tab[2][i - 1] + tab[1][i - 1]) % MOD; } // Reading n, q, s int n, q; string s; cin >> n >> q >> s; // Counting how many reds, greens and blues we have int r = 0, g = 0, b = 0; for (int i = 0; i < n; i++){ if (s[i] == 'N') b++; else if (s[i] == 'C') r++; else g++; } // Counting how many greens and reds we have on even and odd indexes int z0 = 0, c0 = 0, z1 = 0, c1 = 0; for (int i = 0; i < n; i++) { if (i % 2 == 0) { if (s[i] == 'Z') z0++; else if (s[i] == 'C') c0++; } else { if (s[i] == 'Z') z1++; else if (s[i] == 'C') c1++; } } cout << calc(r, g, b, z0, c0, z1, c1) << '\n'; while (q--) { int pos; char c; cin >> pos >> c; pos--; // Update how many reds, greens and blues we have if (s[pos] == 'N') b--; else if (s[pos] == 'C') r--; else g--; if (c == 'N') b++; else if (c == 'C') r++; else g++; // Updating how many greens and reds we have on even and odd indexes if (pos % 2 == 0) { if (s[pos] == 'Z') z0--; if (s[pos] == 'C') c0--; if (c == 'Z') z0++; if (c == 'C') c0++; } else { if (s[pos] == 'Z') z1--; if (s[pos] == 'C') c1--; if (c == 'Z') z1++; if (c == 'C') c1++; } s[pos] = c; cout << calc(r, g, b, z0, c0, z1, c1) << '\n'; } cout << flush; return 0; } |