#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 **/ |
English