#include<bits/stdc++.h> using namespace std; int poz[2][2];//0parzyste 1 nieparzyste char tab[200010]; const long long mod = 1000000007; long long po[200010][3]; void policz(int k, int p, int n){ long long wynik = 0; //printf("%d %d %d %d\n", poz[0][0], poz[0][1], poz[1][0], poz[1][1]); if(poz[0][0]==0 && poz[1][1]==0 && n%2==1 && n>1) wynik--; if(poz[0][1]==0 && poz[1][0]==0 && n%2==1 && n>1) wynik--; //printf("# %lld\n", wynik); for(int i=0;i<3;i++){ if((k-2*i+p+6)%3!=0){ wynik+=po[k][i]; } } printf("%lld\n", (wynik+mod)%mod); } int main() { int n, q, i, z=0, c=0, b=0; scanf("%d%d", &n, &q); po[0][0] = 1; for(i=1;i<=n;i++) { for(int j=0;j<3;j++) po[i][j] = (po[i-1][j]+po[i-1][(j-1+3)%3])%mod; } // for(int i=1;i<=n;i++) // printf("%d: %lld %lld %lld\n", i, po[i][0], po[i][1], po[i][2]); scanf("%s", tab); for(i=0;i<n;i++) { if(tab[i]=='Z'){ z++; poz[0][i%2]++; } if(tab[i]=='C'){ c++; poz[1][i%2]++; } if(tab[i]=='N') b++; }/* silnia[0] = 1; for(i=1;i<=n;i++){ silnia[i] = silnia[i-1]*i%mod; }*/ policz(b, ((z-c)%3+3)%3, n); while(q--) { char znak; scanf("%d %c", &i, &znak); i--; if(tab[i]=='N') b--; if(tab[i]=='Z'){ z--; poz[0][i%2]--; } if(tab[i]=='C'){ c--; poz[1][i%2]--; } tab[i] = znak; if(tab[i]=='N') b++; if(tab[i]=='Z'){ z++; poz[0][i%2]++; } if(tab[i]=='C'){ c++; poz[1][i%2]++; } policz(b,((z-c)%3+3)%3, n); } return 0; }
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 | #include<bits/stdc++.h> using namespace std; int poz[2][2];//0parzyste 1 nieparzyste char tab[200010]; const long long mod = 1000000007; long long po[200010][3]; void policz(int k, int p, int n){ long long wynik = 0; //printf("%d %d %d %d\n", poz[0][0], poz[0][1], poz[1][0], poz[1][1]); if(poz[0][0]==0 && poz[1][1]==0 && n%2==1 && n>1) wynik--; if(poz[0][1]==0 && poz[1][0]==0 && n%2==1 && n>1) wynik--; //printf("# %lld\n", wynik); for(int i=0;i<3;i++){ if((k-2*i+p+6)%3!=0){ wynik+=po[k][i]; } } printf("%lld\n", (wynik+mod)%mod); } int main() { int n, q, i, z=0, c=0, b=0; scanf("%d%d", &n, &q); po[0][0] = 1; for(i=1;i<=n;i++) { for(int j=0;j<3;j++) po[i][j] = (po[i-1][j]+po[i-1][(j-1+3)%3])%mod; } // for(int i=1;i<=n;i++) // printf("%d: %lld %lld %lld\n", i, po[i][0], po[i][1], po[i][2]); scanf("%s", tab); for(i=0;i<n;i++) { if(tab[i]=='Z'){ z++; poz[0][i%2]++; } if(tab[i]=='C'){ c++; poz[1][i%2]++; } if(tab[i]=='N') b++; }/* silnia[0] = 1; for(i=1;i<=n;i++){ silnia[i] = silnia[i-1]*i%mod; }*/ policz(b, ((z-c)%3+3)%3, n); while(q--) { char znak; scanf("%d %c", &i, &znak); i--; if(tab[i]=='N') b--; if(tab[i]=='Z'){ z--; poz[0][i%2]--; } if(tab[i]=='C'){ c--; poz[1][i%2]--; } tab[i] = znak; if(tab[i]=='N') b++; if(tab[i]=='Z'){ z++; poz[0][i%2]++; } if(tab[i]=='C'){ c++; poz[1][i%2]++; } policz(b,((z-c)%3+3)%3, n); } return 0; } |