#include<bits/stdc++.h> using namespace std; const long long mod=1000000000+7; char tab[200009]; bool pustka[1000000]; long long dp[1000000][7]; int t; void punkt(int v) { if(tab[v]=='N') { dp[v+t-1][1]=1; dp[v+t-1][2]=1; } else if(tab[v]=='C') { dp[v+t-1][1]=1; dp[v+t-1][2]=0; } else if(tab[v]=='Z') { dp[v+t-1][1]=0; dp[v+t-1][2]=1; } v+=(t-1); while(v>1) { v=v>>1; if(pustka[v*2+1]==1) { for(int i=1;i<=6;i++) { dp[v][i]=dp[v*2][i]; } } else { dp[v][1]=dp[v*2][1]*dp[v*2+1][5]+dp[v*2][2]*dp[v*2+1][2]+dp[v*2][2]*dp[v*2+1][4]+dp[v*2][3]*dp[v*2+1][5]+dp[v*2][4]*dp[v*2+1][2]+dp[v*2][4]*dp[v*2+1][4]+dp[v*2][6]*dp[v*2+1][1]; dp[v][2]=dp[v*2][1]*dp[v*2+1][1]+dp[v*2][1]*dp[v*2+1][3]+dp[v*2][2]*dp[v*2+1][6]+dp[v*2][3]*dp[v*2+1][1]+dp[v*2][3]*dp[v*2+1][3]+dp[v*2][4]*dp[v*2+1][6]+dp[v*2][5]*dp[v*2+1][2]; dp[v][3]=dp[v*2][1]*dp[v*2+1][6]+dp[v*2][3]*dp[v*2+1][6]+dp[v*2][5]*dp[v*2+1][1]+dp[v*2][5]*dp[v*2+1][3]+dp[v*2][6]*dp[v*2+1][3]; dp[v][4]=dp[v*2][2]*dp[v*2+1][5]+dp[v*2][4]*dp[v*2+1][5]+dp[v*2][5]*dp[v*2+1][4]+dp[v*2][6]*dp[v*2+1][2]+dp[v*2][6]*dp[v*2+1][4]; dp[v][5]=dp[v*2][1]*dp[v*2+1][2]+dp[v*2][1]*dp[v*2+1][4]+dp[v*2][3]*dp[v*2+1][2]+dp[v*2][3]*dp[v*2+1][4]+dp[v*2][5]*dp[v*2+1][5]+dp[v*2][6]*dp[v*2+1][5]; dp[v][6]=dp[v*2][2]*dp[v*2+1][1]+dp[v*2][2]*dp[v*2+1][3]+dp[v*2][4]*dp[v*2+1][1]+dp[v*2][4]*dp[v*2+1][3]+dp[v*2][5]*dp[v*2+1][6]+dp[v*2][6]*dp[v*2+1][6]; for(int i=1;i<=6;i++) { dp[v][i]%=mod; } } } } int TworzenieDrzewa(int x) { x--; int u=1; while(x>0) { x=x/2; u=u*2; } return u; } int main() {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,q; cin>>n>>q; t=TworzenieDrzewa(n+3); for(int i=n+1;i<=t;i++) { pustka[i+t-1]=1; } for(int i=t-1;i>=1;i--) { pustka[i]=pustka[i*2]&pustka[i*2+1]; } for(int i=1;i<=n;i++) { cin>>tab[i]; punkt(i); } cout<<" "; cout<<dp[1][1]+dp[1][2]<<endl; for(int i=1;i<=q;i++) { char znak; int ind; cin>>ind>>znak; tab[ind]=znak; punkt(ind); cout<<" "; cout<<dp[1][1]+dp[1][2]<<endl; } for(int i=1;i<t+t;i++) { cout<<"DP["<<i<<"]="<<dp[i][1]+dp[i][2]<<" pustka[i]="<<pustka[i]<<endl; } return 0; } /** 5 0 NNNCZ **/
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #include<bits/stdc++.h> using namespace std; const long long mod=1000000000+7; char tab[200009]; bool pustka[1000000]; long long dp[1000000][7]; int t; void punkt(int v) { if(tab[v]=='N') { dp[v+t-1][1]=1; dp[v+t-1][2]=1; } else if(tab[v]=='C') { dp[v+t-1][1]=1; dp[v+t-1][2]=0; } else if(tab[v]=='Z') { dp[v+t-1][1]=0; dp[v+t-1][2]=1; } v+=(t-1); while(v>1) { v=v>>1; if(pustka[v*2+1]==1) { for(int i=1;i<=6;i++) { dp[v][i]=dp[v*2][i]; } } else { dp[v][1]=dp[v*2][1]*dp[v*2+1][5]+dp[v*2][2]*dp[v*2+1][2]+dp[v*2][2]*dp[v*2+1][4]+dp[v*2][3]*dp[v*2+1][5]+dp[v*2][4]*dp[v*2+1][2]+dp[v*2][4]*dp[v*2+1][4]+dp[v*2][6]*dp[v*2+1][1]; dp[v][2]=dp[v*2][1]*dp[v*2+1][1]+dp[v*2][1]*dp[v*2+1][3]+dp[v*2][2]*dp[v*2+1][6]+dp[v*2][3]*dp[v*2+1][1]+dp[v*2][3]*dp[v*2+1][3]+dp[v*2][4]*dp[v*2+1][6]+dp[v*2][5]*dp[v*2+1][2]; dp[v][3]=dp[v*2][1]*dp[v*2+1][6]+dp[v*2][3]*dp[v*2+1][6]+dp[v*2][5]*dp[v*2+1][1]+dp[v*2][5]*dp[v*2+1][3]+dp[v*2][6]*dp[v*2+1][3]; dp[v][4]=dp[v*2][2]*dp[v*2+1][5]+dp[v*2][4]*dp[v*2+1][5]+dp[v*2][5]*dp[v*2+1][4]+dp[v*2][6]*dp[v*2+1][2]+dp[v*2][6]*dp[v*2+1][4]; dp[v][5]=dp[v*2][1]*dp[v*2+1][2]+dp[v*2][1]*dp[v*2+1][4]+dp[v*2][3]*dp[v*2+1][2]+dp[v*2][3]*dp[v*2+1][4]+dp[v*2][5]*dp[v*2+1][5]+dp[v*2][6]*dp[v*2+1][5]; dp[v][6]=dp[v*2][2]*dp[v*2+1][1]+dp[v*2][2]*dp[v*2+1][3]+dp[v*2][4]*dp[v*2+1][1]+dp[v*2][4]*dp[v*2+1][3]+dp[v*2][5]*dp[v*2+1][6]+dp[v*2][6]*dp[v*2+1][6]; for(int i=1;i<=6;i++) { dp[v][i]%=mod; } } } } int TworzenieDrzewa(int x) { x--; int u=1; while(x>0) { x=x/2; u=u*2; } return u; } int main() {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,q; cin>>n>>q; t=TworzenieDrzewa(n+3); for(int i=n+1;i<=t;i++) { pustka[i+t-1]=1; } for(int i=t-1;i>=1;i--) { pustka[i]=pustka[i*2]&pustka[i*2+1]; } for(int i=1;i<=n;i++) { cin>>tab[i]; punkt(i); } cout<<" "; cout<<dp[1][1]+dp[1][2]<<endl; for(int i=1;i<=q;i++) { char znak; int ind; cin>>ind>>znak; tab[ind]=znak; punkt(ind); cout<<" "; cout<<dp[1][1]+dp[1][2]<<endl; } for(int i=1;i<t+t;i++) { cout<<"DP["<<i<<"]="<<dp[i][1]+dp[i][2]<<" pustka[i]="<<pustka[i]<<endl; } return 0; } /** 5 0 NNNCZ **/ |