#include <bits/stdc++.h>
using namespace std;
const unsigned int mod=998244353;
const int K=7;
int tab[50009];
unsigned int dp[50009],dp2[50009];
unsigned int suma[50009][K];
int Last[10];
int n,q;
int Oblicz()
{
for(int i=0;i<K;i++)
{
Last[i]=-1;
suma[0][i]=0;
}
tab[n+1]=0;
dp[0]=1;
dp2[0]=0;
suma[0][0]=1;
for(int i=1;i<=n+1;i++)
{
const int t=tab[i];
const int u=Last[t];
for(int j=0;j<K;j++)
{
suma[i][j]=suma[i-1][j];
}
if(u==-1){dp[i]=(dp[i-1]*2)%mod;}
else{dp[i]=(dp[i-1]*2+mod-dp[u-1])%mod;}
dp2[i]=0;
int a;
if(u==-1){a=0;}
else{a=u;}
for(int j=0;j<K;j++)
{
if(j==t||Last[j]==-1){continue;}
int b=Last[j]-1;
if(a<b)
{
dp2[i]=(dp2[i]+suma[b][j]+mod-suma[a][j])%mod;
}
}
for(int j=0;j<K;j++)
{
if(u>Last[j]){continue;}
dp2[i]=(dp2[i]+dp2[Last[j]])%mod;
}
suma[i][t]=(suma[i][t]+dp[i]+mod-dp[i-1])%mod;
Last[t]=i;
}
return dp2[n+1];
}
int main()
{ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++)
{
char z;
cin>>z;
tab[i]=z-'a'+1;
}
cout<<Oblicz()<<'\n';
for(int i=1;i<=q;i++)
{
int ind;
char z;
cin>>ind>>z;
tab[ind]=z-'a'+1;
cout<<Oblicz()<<'\n';
}
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 | #include <bits/stdc++.h> using namespace std; const unsigned int mod=998244353; const int K=7; int tab[50009]; unsigned int dp[50009],dp2[50009]; unsigned int suma[50009][K]; int Last[10]; int n,q; int Oblicz() { for(int i=0;i<K;i++) { Last[i]=-1; suma[0][i]=0; } tab[n+1]=0; dp[0]=1; dp2[0]=0; suma[0][0]=1; for(int i=1;i<=n+1;i++) { const int t=tab[i]; const int u=Last[t]; for(int j=0;j<K;j++) { suma[i][j]=suma[i-1][j]; } if(u==-1){dp[i]=(dp[i-1]*2)%mod;} else{dp[i]=(dp[i-1]*2+mod-dp[u-1])%mod;} dp2[i]=0; int a; if(u==-1){a=0;} else{a=u;} for(int j=0;j<K;j++) { if(j==t||Last[j]==-1){continue;} int b=Last[j]-1; if(a<b) { dp2[i]=(dp2[i]+suma[b][j]+mod-suma[a][j])%mod; } } for(int j=0;j<K;j++) { if(u>Last[j]){continue;} dp2[i]=(dp2[i]+dp2[Last[j]])%mod; } suma[i][t]=(suma[i][t]+dp[i]+mod-dp[i-1])%mod; Last[t]=i; } return dp2[n+1]; } int main() {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>q; for(int i=1;i<=n;i++) { char z; cin>>z; tab[i]=z-'a'+1; } cout<<Oblicz()<<'\n'; for(int i=1;i<=q;i++) { int ind; char z; cin>>ind>>z; tab[ind]=z-'a'+1; cout<<Oblicz()<<'\n'; } return 0; } |
English