#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; } |
English