#include <iostream>
#include <vector>
using namespace std;
#define LL long long
#define MOD 998244353
inline LL add(LL a, LL b) { a += b; if(a >= MOD) a -= MOD; return a; }
inline LL sub(LL a, LL b) { a -= b; if(a < 0) a += MOD; return a; }
inline LL mul(LL a, LL b) { return (a % MOD) * (b % MOD) % MOD; }
void compute_dp(const string &s, int n, vector<LL>& F, vector<LL>& U) {
vector<int> last(6, 0);
vector<LL> newContrib(6, 0);
F[0] = 0; U[0] = 0;
for (int i = 1; i <= n; i++){
int c = s[i-1] - 'a';
if(last[c] == 0) {
F[i] = (2 * F[i-1] + 1) % MOD;
LL addUnique = (U[i-1] + 1) % MOD;
U[i] = (U[i-1] + addUnique) % MOD;
newContrib[c] = addUnique;
} else {
int j = last[c];
F[i] = (2 * F[i-1] - F[j-1] + MOD) % MOD;
LL diff = (F[i-1] - F[j-1] + MOD) % MOD;
U[i] = (U[i-1] + diff - newContrib[c] + MOD) % MOD;
newContrib[c] = diff;
}
last[c] = i;
}
}
int main(){
int n, q;
cin >> n >> q;
string s;
cin >> s;
vector<LL> F(n+1, 0), U(n+1, 0);
compute_dp(s, n, F, U);
LL ans = (F[n] - U[n] + MOD) % MOD;
cout << ans << "\n";
for (int i = 0; i < q; i++){
int pos;
char c;
cin >> pos >> c;
if(s[pos-1] == c) {
cout << ans << endl;
continue;
}
s[pos-1] = c;
compute_dp(s, n, F, U);
ans = (F[n] - U[n] + MOD) % MOD;
cout << ans << endl;
}
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 | #include <iostream> #include <vector> using namespace std; #define LL long long #define MOD 998244353 inline LL add(LL a, LL b) { a += b; if(a >= MOD) a -= MOD; return a; } inline LL sub(LL a, LL b) { a -= b; if(a < 0) a += MOD; return a; } inline LL mul(LL a, LL b) { return (a % MOD) * (b % MOD) % MOD; } void compute_dp(const string &s, int n, vector<LL>& F, vector<LL>& U) { vector<int> last(6, 0); vector<LL> newContrib(6, 0); F[0] = 0; U[0] = 0; for (int i = 1; i <= n; i++){ int c = s[i-1] - 'a'; if(last[c] == 0) { F[i] = (2 * F[i-1] + 1) % MOD; LL addUnique = (U[i-1] + 1) % MOD; U[i] = (U[i-1] + addUnique) % MOD; newContrib[c] = addUnique; } else { int j = last[c]; F[i] = (2 * F[i-1] - F[j-1] + MOD) % MOD; LL diff = (F[i-1] - F[j-1] + MOD) % MOD; U[i] = (U[i-1] + diff - newContrib[c] + MOD) % MOD; newContrib[c] = diff; } last[c] = i; } } int main(){ int n, q; cin >> n >> q; string s; cin >> s; vector<LL> F(n+1, 0), U(n+1, 0); compute_dp(s, n, F, U); LL ans = (F[n] - U[n] + MOD) % MOD; cout << ans << "\n"; for (int i = 0; i < q; i++){ int pos; char c; cin >> pos >> c; if(s[pos-1] == c) { cout << ans << endl; continue; } s[pos-1] = c; compute_dp(s, n, F, U); ans = (F[n] - U[n] + MOD) % MOD; cout << ans << endl; } return 0; } |
English