#include<bits/stdc++.h> using namespace std; typedef pair<int, char> par; vector<par> req; string s; int N, n, dp[7][3][7], istaken[6], ones[6]; const int M = 998244353; void solve() { int wyn = 0, a, newone, newtwo; for(int i=0; i<N; i++) for(int j=1; j<3; j++) for(int k=0; k<N; k++) dp[i][j][k] = 0; for(int i=0; i<N; i++) istaken[i] = ones[i] = 0; for(int i=0; i<s.size(); i++) { a = s[i] - 'a'; newone = newtwo = 0; wyn = (wyn + ones[a]) % M; ones[a] = 0; for(int j=0; j<N; j++) { newone = (newone + dp[j][1][a]) % M; newtwo = (newtwo + dp[j][2][a]) % M; wyn = (wyn + dp[j][2][a]) % M; ones[a] = (ones[a] + dp[j][1][a]) % M; dp[j][1][a] = dp[j][2][a] = 0; } for(int j=0; j<N; j++) { dp[a][2][j] = (((dp[a][2][j] + dp[a][1][j]) % M) + newtwo) % M; dp[a][1][j] = newone; } if(istaken[a] == 0) { for(int j=0; j<N; j++) dp[a][1][j]++; istaken[a] = 1; } else if(istaken[a] == 1) { wyn = (wyn + 1) % M; istaken[a] = 2; } } cout<<wyn<<'\n'; return; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int q, a; char c; cin>>n>>q>>s; for(int i=0; i<s.size(); i++) if(s[i] - 'a' > N) N = s[i] - 'a'; for(int i=1; i<=q; i++) { cin>>a>>c; if(c - 'a' > N) N = c - 'a'; req.push_back(par(a, c)); } N++; solve(); for(int i=0; i<q; i++) { s[req[i].first-1] = req[i].second; 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 | #include<bits/stdc++.h> using namespace std; typedef pair<int, char> par; vector<par> req; string s; int N, n, dp[7][3][7], istaken[6], ones[6]; const int M = 998244353; void solve() { int wyn = 0, a, newone, newtwo; for(int i=0; i<N; i++) for(int j=1; j<3; j++) for(int k=0; k<N; k++) dp[i][j][k] = 0; for(int i=0; i<N; i++) istaken[i] = ones[i] = 0; for(int i=0; i<s.size(); i++) { a = s[i] - 'a'; newone = newtwo = 0; wyn = (wyn + ones[a]) % M; ones[a] = 0; for(int j=0; j<N; j++) { newone = (newone + dp[j][1][a]) % M; newtwo = (newtwo + dp[j][2][a]) % M; wyn = (wyn + dp[j][2][a]) % M; ones[a] = (ones[a] + dp[j][1][a]) % M; dp[j][1][a] = dp[j][2][a] = 0; } for(int j=0; j<N; j++) { dp[a][2][j] = (((dp[a][2][j] + dp[a][1][j]) % M) + newtwo) % M; dp[a][1][j] = newone; } if(istaken[a] == 0) { for(int j=0; j<N; j++) dp[a][1][j]++; istaken[a] = 1; } else if(istaken[a] == 1) { wyn = (wyn + 1) % M; istaken[a] = 2; } } cout<<wyn<<'\n'; return; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int q, a; char c; cin>>n>>q>>s; for(int i=0; i<s.size(); i++) if(s[i] - 'a' > N) N = s[i] - 'a'; for(int i=1; i<=q; i++) { cin>>a>>c; if(c - 'a' > N) N = c - 'a'; req.push_back(par(a, c)); } N++; solve(); for(int i=0; i<q; i++) { s[req[i].first-1] = req[i].second; solve(); } return 0; } |