#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(); } |
polski