// Marcin Knapik #include<bits/stdc++.h> using namespace std; #define FOR(i, n) for (int i = 0; i < n; i++) #define f first #define s second #define pb push_back #define all(s) s.begin(), s.end() #define sz(s) (int)s.size() const int mod = 1e9 + 7; const int N = 2e5 + 3; int dp[2][2][N]; void prep() { dp[0][0][0] = 1; dp[1][1][0] = 1; for (int i = 1; i < N; i++) { for (int w = 0; w <= 1; w++) { dp[w][1][i] = (1ll * dp[w][0][i - 1] * 2 + dp[w][1][i - 1]) % mod; dp[w][0][i] = dp[w][1][i - 1]; } } } void solve () { prep(); int n, q; cin >> n >> q; string s; cin >> s; map<pair<char, bool>, int> parity; auto quan = [&parity] (char c) { return parity[{c, 0}] + parity[{c, 1}]; }; auto policz = [&] () { if(n == 1){ return s[0] == 'N' ? 2 : 1; } int ret = dp[quan('C') % 3 != quan('Z') % 3][1][quan('N')]; // cout << ret << endl; if (n & 1) { ret = (ret + mod - (parity[{'C', 0}] == 0 and parity[{'Z', 1}] == 0)) % mod; ret = (ret + mod - (parity[{'C', 1}] == 0 and parity[{'Z', 0}] == 0)) % mod; } return ret; }; FOR (i, n) { parity[{s[i], i & 1}]++; } cout << policz() << '\n'; FOR (_, q) { int poz; char znak; cin >> poz >> znak; poz--; parity[{s[poz], poz & 1}]--; s[poz] = znak; parity[{s[poz], poz & 1}]++; cout << policz() << '\n'; } } int main () { ios::sync_with_stdio(0); cin.tie(0); int tests = 1; // cin >> tests; for (int test = 1; test <= tests; test++) { solve(); } 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 | // Marcin Knapik #include<bits/stdc++.h> using namespace std; #define FOR(i, n) for (int i = 0; i < n; i++) #define f first #define s second #define pb push_back #define all(s) s.begin(), s.end() #define sz(s) (int)s.size() const int mod = 1e9 + 7; const int N = 2e5 + 3; int dp[2][2][N]; void prep() { dp[0][0][0] = 1; dp[1][1][0] = 1; for (int i = 1; i < N; i++) { for (int w = 0; w <= 1; w++) { dp[w][1][i] = (1ll * dp[w][0][i - 1] * 2 + dp[w][1][i - 1]) % mod; dp[w][0][i] = dp[w][1][i - 1]; } } } void solve () { prep(); int n, q; cin >> n >> q; string s; cin >> s; map<pair<char, bool>, int> parity; auto quan = [&parity] (char c) { return parity[{c, 0}] + parity[{c, 1}]; }; auto policz = [&] () { if(n == 1){ return s[0] == 'N' ? 2 : 1; } int ret = dp[quan('C') % 3 != quan('Z') % 3][1][quan('N')]; // cout << ret << endl; if (n & 1) { ret = (ret + mod - (parity[{'C', 0}] == 0 and parity[{'Z', 1}] == 0)) % mod; ret = (ret + mod - (parity[{'C', 1}] == 0 and parity[{'Z', 0}] == 0)) % mod; } return ret; }; FOR (i, n) { parity[{s[i], i & 1}]++; } cout << policz() << '\n'; FOR (_, q) { int poz; char znak; cin >> poz >> znak; poz--; parity[{s[poz], poz & 1}]--; s[poz] = znak; parity[{s[poz], poz & 1}]++; cout << policz() << '\n'; } } int main () { ios::sync_with_stdio(0); cin.tie(0); int tests = 1; // cin >> tests; for (int test = 1; test <= tests; test++) { solve(); } return 0; } |