#include<bits/stdc++.h>
using namespace std;
int MOD = 1e9 + 7;
int n, N, C, Z, q;
int p[5],b[1000005][5], ile[5][5];
char c[1000005];
void odp(){
long long odp = 0;
for(int i = 0 ; i <= p[0] ; i++){
if((p[1] + i) % 3 == (p[2] +p[0] - i) % 3){
if(i == 0){
odp = b[p[0]][1];
if(ile[1][0] == 0 && ile[2][1] == 0 && ile[0][1] % 3 != 0)
odp--;
if(ile[1][1] == 0 && ile[2][0] == 0 && ile[0][0] % 3 != 0)
odp--;
break;
}
else if(i == 1){
odp = b[p[0]][2];
if(ile[1][0] == 0 && ile[2][1] == 0 && ile[0][1] % 3 != 1)
odp--;
if(ile[1][1] == 0 && ile[2][0] == 0 && ile[0][0] % 3 != 1)
odp--;
break;
}
else{
odp = b[p[0]][3];
if(ile[1][0] == 0 && ile[2][1] == 0 && ile[0][1] % 3 != 2)
odp--;
if(ile[1][1] == 0 && ile[2][0] == 0 && ile[0][0] % 3 != 2)
odp--;
break;
}
}
}
cout << odp<<"\n";
}
int fun(char x){
if(x == 'N')
return 0;
if(x == 'C')
return 1;
return 2;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> q;
b[0][1] = 0;
b[0][2] = 1;
b[0][3] = 1;
for(int i = 1 ; i <= n ; i++){
b[i][1] = (b[i-1][1] + b[i-1][3]) % MOD;
b[i][2] = (b[i-1][2] + b[i-1][1]) % MOD;
b[i][3] = (b[i-1][3] + b[i-1][2]) % MOD;
}
for(int i = 1 ; i <= n ; i++){
cin >> c[i];
int w = fun(c[i]);
p[w]++;
ile[w][i%2]++;
}
odp();
for(int i = 1 ; i <= q ; i++){
int x;
char ch;
cin >> x >> ch;
int w = fun(c[x]);
int y = fun(ch);
p[w]--;
p[y]++;
ile[w][x%2]--;
ile[y][x%2]++;
c[x] = ch;
odp();
}
}
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 84 85 86 | #include<bits/stdc++.h> using namespace std; int MOD = 1e9 + 7; int n, N, C, Z, q; int p[5],b[1000005][5], ile[5][5]; char c[1000005]; void odp(){ long long odp = 0; for(int i = 0 ; i <= p[0] ; i++){ if((p[1] + i) % 3 == (p[2] +p[0] - i) % 3){ if(i == 0){ odp = b[p[0]][1]; if(ile[1][0] == 0 && ile[2][1] == 0 && ile[0][1] % 3 != 0) odp--; if(ile[1][1] == 0 && ile[2][0] == 0 && ile[0][0] % 3 != 0) odp--; break; } else if(i == 1){ odp = b[p[0]][2]; if(ile[1][0] == 0 && ile[2][1] == 0 && ile[0][1] % 3 != 1) odp--; if(ile[1][1] == 0 && ile[2][0] == 0 && ile[0][0] % 3 != 1) odp--; break; } else{ odp = b[p[0]][3]; if(ile[1][0] == 0 && ile[2][1] == 0 && ile[0][1] % 3 != 2) odp--; if(ile[1][1] == 0 && ile[2][0] == 0 && ile[0][0] % 3 != 2) odp--; break; } } } cout << odp<<"\n"; } int fun(char x){ if(x == 'N') return 0; if(x == 'C') return 1; return 2; } int main(){ ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); cin >> n >> q; b[0][1] = 0; b[0][2] = 1; b[0][3] = 1; for(int i = 1 ; i <= n ; i++){ b[i][1] = (b[i-1][1] + b[i-1][3]) % MOD; b[i][2] = (b[i-1][2] + b[i-1][1]) % MOD; b[i][3] = (b[i-1][3] + b[i-1][2]) % MOD; } for(int i = 1 ; i <= n ; i++){ cin >> c[i]; int w = fun(c[i]); p[w]++; ile[w][i%2]++; } odp(); for(int i = 1 ; i <= q ; i++){ int x; char ch; cin >> x >> ch; int w = fun(c[x]); int y = fun(ch); p[w]--; p[y]++; ile[w][x%2]--; ile[y][x%2]++; c[x] = ch; odp(); } } |
English