#include <bits/stdc++.h> using namespace std; long long mod = 1000000007; long long sil[200005], resil[200005]; long long fpow(long long pod, long long wyk = mod - 2) { long long w = 1; while (wyk) { if (wyk & 1) { w *= pod; w %= mod; } pod *= pod; pod %= mod; wyk /= 2; } return w; } long long dwm(long long a, long long b) { long long wyn = (sil[a] * resil[b]) % mod; wyn = wyn * (resil[a - b]) % mod; return wyn; } long long papiez(int n, int z) { // cout << n << ' ' << z << '\n'; z %= 3; z += 3; z %= 3; if (z == 0) return ((fpow(2, n) + fpow(-1, n) * 2) * fpow(3)) % mod; else if (n % 3 == 0) { return ((fpow(2, n) - fpow(-1, n / 3)) * fpow(3)) % mod; } else if (n % 3 == 1) { return ((fpow(2, n) + fpow(-1, n / 3)) * fpow(3)) % mod; } else { if (z == 1) return ((2 * (fpow(2, n - 1) + fpow(-1, n / 3)) * fpow(3)) + ((n / 3) % 2 ? 1 : -1)) % mod; else return ((fpow(2, n) - fpow(-1, n / 3)) * fpow(3)) % mod; } } class Wynik { private: int v[2]{}; int c[300]{}; long long wyn = 0; string s; int od() { if (s.size() % 2 && s.size() > 1) return (v[0] == s.size()) + (v[1] == s.size()); return 0; } void liczWyn() { long long wyn = fpow(2, c['N']); wyn -= papiez(c['N'], c['Z'] - c['C']); cout << (wyn % mod - od() + mod) % mod << '\n'; } int lm(int i, int j, char c) { return (c == 'N' || c == (((i + j) % 2) ? 'C' : 'Z')); } public: Wynik(string S); void upd() { int t; char p; cin >> t >> p; t--; c[s[t]]--; c[p]++; for (int i = 0; i < 2; i++) { v[i] -= lm(i, t, s[t]); v[i] += lm(i, t, p); } s[t] = p; liczWyn(); } }; Wynik::Wynik(string S) { s = S; for (auto i : s) c[i]++; for (int i = 0; i < 2; i++) for (int j = 0; j < s.size(); j++) v[i] += lm(i, j, s[j]); liczWyn(); } map<string, int> wyn; int main() { ios_base::sync_with_stdio(0); int n, q; string s; cin >> n >> q >> s; sil[0] = 1; resil[0] = 1; for (long long i = 1; i <= n; i++) { sil[i] = (sil[i - 1] * i) % mod; resil[i] = fpow(sil[i]); } Wynik z(s); for (int i = 0; i < q; i++) z.upd(); }
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 121 122 123 124 125 126 127 128 129 | #include <bits/stdc++.h> using namespace std; long long mod = 1000000007; long long sil[200005], resil[200005]; long long fpow(long long pod, long long wyk = mod - 2) { long long w = 1; while (wyk) { if (wyk & 1) { w *= pod; w %= mod; } pod *= pod; pod %= mod; wyk /= 2; } return w; } long long dwm(long long a, long long b) { long long wyn = (sil[a] * resil[b]) % mod; wyn = wyn * (resil[a - b]) % mod; return wyn; } long long papiez(int n, int z) { // cout << n << ' ' << z << '\n'; z %= 3; z += 3; z %= 3; if (z == 0) return ((fpow(2, n) + fpow(-1, n) * 2) * fpow(3)) % mod; else if (n % 3 == 0) { return ((fpow(2, n) - fpow(-1, n / 3)) * fpow(3)) % mod; } else if (n % 3 == 1) { return ((fpow(2, n) + fpow(-1, n / 3)) * fpow(3)) % mod; } else { if (z == 1) return ((2 * (fpow(2, n - 1) + fpow(-1, n / 3)) * fpow(3)) + ((n / 3) % 2 ? 1 : -1)) % mod; else return ((fpow(2, n) - fpow(-1, n / 3)) * fpow(3)) % mod; } } class Wynik { private: int v[2]{}; int c[300]{}; long long wyn = 0; string s; int od() { if (s.size() % 2 && s.size() > 1) return (v[0] == s.size()) + (v[1] == s.size()); return 0; } void liczWyn() { long long wyn = fpow(2, c['N']); wyn -= papiez(c['N'], c['Z'] - c['C']); cout << (wyn % mod - od() + mod) % mod << '\n'; } int lm(int i, int j, char c) { return (c == 'N' || c == (((i + j) % 2) ? 'C' : 'Z')); } public: Wynik(string S); void upd() { int t; char p; cin >> t >> p; t--; c[s[t]]--; c[p]++; for (int i = 0; i < 2; i++) { v[i] -= lm(i, t, s[t]); v[i] += lm(i, t, p); } s[t] = p; liczWyn(); } }; Wynik::Wynik(string S) { s = S; for (auto i : s) c[i]++; for (int i = 0; i < 2; i++) for (int j = 0; j < s.size(); j++) v[i] += lm(i, j, s[j]); liczWyn(); } map<string, int> wyn; int main() { ios_base::sync_with_stdio(0); int n, q; string s; cin >> n >> q >> s; sil[0] = 1; resil[0] = 1; for (long long i = 1; i <= n; i++) { sil[i] = (sil[i - 1] * i) % mod; resil[i] = fpow(sil[i]); } Wynik z(s); for (int i = 0; i < q; i++) z.upd(); } |