#include <bits/stdc++.h>
//#define int long long
#define ll long long
#define db double
#define fi first
#define se second
#define pii pair<int,int>
#define vi vector<int>
using namespace std;
const int maxn=2e5;
const int mod=1e9+7;
int has[2][2];
int cnt[3]={};
int add(int x,int y) {
return (x+=y)>=mod?x-mod:x;
}
int fpw(int x,int k,int p) {
int ret=1;
while (k) {
if (k&1) ret=1ll*ret*x%p;
x=1ll*x*x%p; k>>=1;
}
return ret;
}
int f[maxn+5][3];
int n,q;
char s[maxn+5];
int a[maxn+5];
void calc() {
//cout<<"**"<<cnt[0]<<' '<<cnt[1]<<'\n';
int ans=0;
for (int j=0;j<3;j++) {
int t=(j+cnt[0]-cnt[1])%3;
t=(t+3)%3;
if (t!=0) ans=add(ans,f[cnt[2]][j]);
}
if (n%2==1) {
if (has[0][1]==0 && has[1][0]==0) ans--;
if (has[0][0]==0 && has[1][1]==0) ans--;
}
cout<<ans<<'\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>q;
cin>>(s+1);
f[0][0]=1;
for (int i=1;i<=maxn;i++) {
for (int j=0;j<3;j++) {
for (int k=0;k<2;k++) {
int o=(k==0?1:2);
f[i][(j+o)%3]=add(f[i][(j+o)%3],f[i-1][j]);
}
}
}
for (int i=1;i<=n;i++) {
if (s[i]=='Z') a[i]=0;
else if (s[i]=='C') a[i]=1;
else a[i]=2;
if (a[i]<=1) has[i%2][a[i]]++;
cnt[a[i]]++;
}
calc();
for (int i=1;i<=q;i++) {
int p; char c; int x;
cin>>p>>c;
if (c=='Z') x=0; else if (c=='C') x=1; else x=2;
cnt[a[p]]--;
if (a[p]<=1)
has[p%2][a[p]]--;
a[p]=x;
cnt[a[p]]++;
if (a[p]<=1)
has[p%2][a[p]]++;
calc();
}
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 | #include <bits/stdc++.h> //#define int long long #define ll long long #define db double #define fi first #define se second #define pii pair<int,int> #define vi vector<int> using namespace std; const int maxn=2e5; const int mod=1e9+7; int has[2][2]; int cnt[3]={}; int add(int x,int y) { return (x+=y)>=mod?x-mod:x; } int fpw(int x,int k,int p) { int ret=1; while (k) { if (k&1) ret=1ll*ret*x%p; x=1ll*x*x%p; k>>=1; } return ret; } int f[maxn+5][3]; int n,q; char s[maxn+5]; int a[maxn+5]; void calc() { //cout<<"**"<<cnt[0]<<' '<<cnt[1]<<'\n'; int ans=0; for (int j=0;j<3;j++) { int t=(j+cnt[0]-cnt[1])%3; t=(t+3)%3; if (t!=0) ans=add(ans,f[cnt[2]][j]); } if (n%2==1) { if (has[0][1]==0 && has[1][0]==0) ans--; if (has[0][0]==0 && has[1][1]==0) ans--; } cout<<ans<<'\n'; } int main() { ios::sync_with_stdio(0); cin.tie(0); cin>>n>>q; cin>>(s+1); f[0][0]=1; for (int i=1;i<=maxn;i++) { for (int j=0;j<3;j++) { for (int k=0;k<2;k++) { int o=(k==0?1:2); f[i][(j+o)%3]=add(f[i][(j+o)%3],f[i-1][j]); } } } for (int i=1;i<=n;i++) { if (s[i]=='Z') a[i]=0; else if (s[i]=='C') a[i]=1; else a[i]=2; if (a[i]<=1) has[i%2][a[i]]++; cnt[a[i]]++; } calc(); for (int i=1;i<=q;i++) { int p; char c; int x; cin>>p>>c; if (c=='Z') x=0; else if (c=='C') x=1; else x=2; cnt[a[p]]--; if (a[p]<=1) has[p%2][a[p]]--; a[p]=x; cnt[a[p]]++; if (a[p]<=1) has[p%2][a[p]]++; calc(); } return 0; } |
English