#include <bits/stdc++.h> using namespace std; const int mod = 1e9+7; int cntZ[2]; int cntC[2]; int cntN; long long pot2[200005]; long long inv3; long long pot(long long a, int x){ if(x == 0) return 1; if(x&1) return pot(a, x-1)*a%mod; long long tmp = pot(a, x/2); return tmp*tmp%mod; } long long binom_sum(int n, int k){ k %= 3; int a = (n-2*k)%6; if(a < 0) a += 6; long long res = pot2[n]; if(a == 0) res+=2; else if(a == 1 || a == 5) res+=1; else if(a == 3) res-=2; else res-=1; //cout<<"res "<<res<<endl; res = res*inv3%mod; if(res < 0) res+=mod; //cout<<"binom_sum: "<<n<<" "<<k<<" "<<res<<endl; return res; } void query(int n){ int sumZ = cntZ[0]+cntZ[1]; int sumC = cntC[0]+cntC[1]; int k = ((sumC-sumZ+cntN)*2)%3; long long res = pot2[cntN]-binom_sum(cntN, k); if(cntZ[0] == 0 && cntC[1] == 0){ if(n%2 && n>1) res--; } if(cntC[0] == 0 && cntZ[1] == 0){ if(n%2 && n>1) res--; } res %= mod; if(res < 0) res += mod; cout<<res<<"\n"; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, q; cin>>n>>q; string s; cin>>s; pot2[0] = 1; for(int i=1;i<=n;i++){ pot2[i] = (pot2[i-1]*2)%mod; } inv3 = pot(3, mod-2); for(int i=0;i<n;i++){ if(s[i] == 'N') cntN++; else if(s[i] == 'Z') cntZ[i&1]++; else cntC[i&1]++; } query(n); while(q--){ int i; char x; cin>>i>>x; i--; if(s[i] == 'N') cntN--; else if(s[i] == 'Z') cntZ[i&1]--; else cntC[i&1]--; s[i] = x; if(s[i] == 'N') cntN++; else if(s[i] == 'Z') cntZ[i&1]++; else cntC[i&1]++; query(n); } }
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 87 | #include <bits/stdc++.h> using namespace std; const int mod = 1e9+7; int cntZ[2]; int cntC[2]; int cntN; long long pot2[200005]; long long inv3; long long pot(long long a, int x){ if(x == 0) return 1; if(x&1) return pot(a, x-1)*a%mod; long long tmp = pot(a, x/2); return tmp*tmp%mod; } long long binom_sum(int n, int k){ k %= 3; int a = (n-2*k)%6; if(a < 0) a += 6; long long res = pot2[n]; if(a == 0) res+=2; else if(a == 1 || a == 5) res+=1; else if(a == 3) res-=2; else res-=1; //cout<<"res "<<res<<endl; res = res*inv3%mod; if(res < 0) res+=mod; //cout<<"binom_sum: "<<n<<" "<<k<<" "<<res<<endl; return res; } void query(int n){ int sumZ = cntZ[0]+cntZ[1]; int sumC = cntC[0]+cntC[1]; int k = ((sumC-sumZ+cntN)*2)%3; long long res = pot2[cntN]-binom_sum(cntN, k); if(cntZ[0] == 0 && cntC[1] == 0){ if(n%2 && n>1) res--; } if(cntC[0] == 0 && cntZ[1] == 0){ if(n%2 && n>1) res--; } res %= mod; if(res < 0) res += mod; cout<<res<<"\n"; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, q; cin>>n>>q; string s; cin>>s; pot2[0] = 1; for(int i=1;i<=n;i++){ pot2[i] = (pot2[i-1]*2)%mod; } inv3 = pot(3, mod-2); for(int i=0;i<n;i++){ if(s[i] == 'N') cntN++; else if(s[i] == 'Z') cntZ[i&1]++; else cntC[i&1]++; } query(n); while(q--){ int i; char x; cin>>i>>x; i--; if(s[i] == 'N') cntN--; else if(s[i] == 'Z') cntZ[i&1]--; else cntC[i&1]--; s[i] = x; if(s[i] == 'N') cntN++; else if(s[i] == 'Z') cntZ[i&1]++; else cntC[i&1]++; query(n); } } |