#include <ios> #define MOD 1000000007 using namespace std; long long dpsum[200001],dp[200001][3],wej[200001]; long long a,b,c,d,e,f,l,k,p,w,n,q,bil,ncnt; char z; long long cnt[2][2]; // [0][1] = na parzystych miejscach ile jest 'Z' long long calc(){ if (n==1) return ncnt ? 2 : 1; long long ret=dpsum[ncnt]-dp[ncnt][abs(bil)%3]; if (n&1){ if (!(cnt[0][0]+cnt[0][1]+cnt[1][0]+cnt[1][1])) ret-=2; if ((cnt[0][0]||cnt[1][1])&&(!cnt[0][1]&&!cnt[1][0])) --ret; if ((cnt[0][1]||cnt[1][0])&&(!cnt[0][0]&&!cnt[1][1])) --ret; } return (ret+2ll*MOD)%MOD; } int main(){ scanf("%lld%lld\n", &n, &q); for (a=1; a<=n; ++a){ wej[a]=getchar_unlocked(); if (wej[a]=='N'){ ++ncnt; continue; } bil+=wej[a]=='C' ? 1 : -1; ++cnt[a&1][wej[a]=='C' ? 0 : 1]; } dp[0][0]=dpsum[0]=1; for (a=1; a<=n; ++a) for (b=0; b<3; ++b){ dp[a][b]=dpsum[a-1]-dp[a-1][b]+MOD; if (dp[a][b]>=MOD) dp[a][b]-=MOD; dpsum[a]+=dp[a][b]; if (dpsum[a]>=MOD) dpsum[a]-=MOD; } printf("%lld\n", calc()); for (; q--;){ scanf("%lld%*c%c", &p, &z); if (wej[p]=='N') --ncnt; else{ bil-=wej[p]=='C' ? 1 : -1; --cnt[p&1][wej[p]=='C' ? 0 : 1]; } if (z=='N') ++ncnt; else{ bil+=z=='C' ? 1 : -1; ++cnt[p&1][z=='C' ? 0 : 1]; } wej[p]=z; printf("%lld\n", calc()); } }
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 | #include <ios> #define MOD 1000000007 using namespace std; long long dpsum[200001],dp[200001][3],wej[200001]; long long a,b,c,d,e,f,l,k,p,w,n,q,bil,ncnt; char z; long long cnt[2][2]; // [0][1] = na parzystych miejscach ile jest 'Z' long long calc(){ if (n==1) return ncnt ? 2 : 1; long long ret=dpsum[ncnt]-dp[ncnt][abs(bil)%3]; if (n&1){ if (!(cnt[0][0]+cnt[0][1]+cnt[1][0]+cnt[1][1])) ret-=2; if ((cnt[0][0]||cnt[1][1])&&(!cnt[0][1]&&!cnt[1][0])) --ret; if ((cnt[0][1]||cnt[1][0])&&(!cnt[0][0]&&!cnt[1][1])) --ret; } return (ret+2ll*MOD)%MOD; } int main(){ scanf("%lld%lld\n", &n, &q); for (a=1; a<=n; ++a){ wej[a]=getchar_unlocked(); if (wej[a]=='N'){ ++ncnt; continue; } bil+=wej[a]=='C' ? 1 : -1; ++cnt[a&1][wej[a]=='C' ? 0 : 1]; } dp[0][0]=dpsum[0]=1; for (a=1; a<=n; ++a) for (b=0; b<3; ++b){ dp[a][b]=dpsum[a-1]-dp[a-1][b]+MOD; if (dp[a][b]>=MOD) dp[a][b]-=MOD; dpsum[a]+=dp[a][b]; if (dpsum[a]>=MOD) dpsum[a]-=MOD; } printf("%lld\n", calc()); for (; q--;){ scanf("%lld%*c%c", &p, &z); if (wej[p]=='N') --ncnt; else{ bil-=wej[p]=='C' ? 1 : -1; --cnt[p&1][wej[p]=='C' ? 0 : 1]; } if (z=='N') ++ncnt; else{ bil+=z=='C' ? 1 : -1; ++cnt[p&1][z=='C' ? 0 : 1]; } wej[p]=z; printf("%lld\n", calc()); } } |