//Jakub Nowak XIV LO Wroclaw #include<bits/stdc++.h> using namespace std; #define int long long const int N = 2e5+7, mod = 1e9+7, x3 = 3e6;//x3 = duza wielokrotnosc 3 int n, q;//n<=2e5; q<=1e5 string S; int nieb, ziel, czer, cp, zp;//odp = (dp[nieb][(czer-ziel+1+3e6)%3]+dp[nieb][(czer-ziel-1+3e6)%3]-(cp==0&&zp==ziel)-(cp==czer&&zp==0)+mod)%mod; int dp[N][3]={1};//dp[k][r] = liczba kombinacji doboru wartosci zbioru k niebieskich, tak aby roznica w nim wynosila r (mod 1e9+7) void dodaj(int i) { if(S[i]=='N') nieb++; if(S[i]=='Z') ziel++, zp+=!(i%2); if(S[i]=='C') czer++, cp+=!(i%2); } void usun(int k) { if(S[k]=='N') nieb--; if(S[k]=='Z') ziel--, zp-=!(k%2); if(S[k]=='C') czer--, cp-=!(k%2); } int odp() { return (dp[nieb][(czer-ziel+1+x3)%3]+dp[nieb][(czer-ziel-1+x3)%3]-(cp==0&&zp==ziel&&(n%2)==1&&n!=1)-(cp==czer&&zp==0&&(n%2)==1&&n!=1)+mod)%mod; } void deb() { cout<<"\n------deb-----\n"; cout<<"Slowo: "<<S<<"\n"; cout<<"Z; C; N: "<<ziel<<"; "<<czer<<"; "<<nieb<<"\n"; cout<<"CP; ZP: "<<cp<<"; "<<zp<<"\n"; cout<<"Czy zielone na parzystych, czerwone na nieparzystych: "<<(cp==0&&zp==ziel)<<"\n"; cout<<"Czy czerwone na parzystych, zielone na nieparzystych: "<<(cp==czer&&zp==0)<<"\n"; cout<<"Wynik: "; } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>q; for(int i=1; i<=n; i++) {//liczenie dp for(int r=0; r<3; r++) dp[i][r]=(dp[i-1][(r+2)%3]+dp[i-1][(r+1)%3])%mod; } cin>>S; for(int i=0; i<S.size(); i++) { dodaj(i); } //odp = (dp[nieb][(czer-ziel+1+x3)%3]+dp[nieb][(czer-ziel-1+x3)%3]-(cp==0&&zp==ziel)-(cp==czer&&zp==0)+mod)%mod;//co gdy opcja z np nie jest dobra? //deb(); cout<<odp()<<"\n"; for(int i=1; i<=q; i++) { int k; char ch; cin>>k>>ch; usun(k-1); S[k-1]=ch; dodaj(k-1); //odp = (dp[nieb][(czer-ziel+1+x3)%3]+dp[nieb][(czer-ziel-1+x3)%3]-(cp==0&&zp==ziel)-(cp==czer&&zp==0)+mod)%mod; //deb(); cout<<odp()<<"\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 | //Jakub Nowak XIV LO Wroclaw #include<bits/stdc++.h> using namespace std; #define int long long const int N = 2e5+7, mod = 1e9+7, x3 = 3e6;//x3 = duza wielokrotnosc 3 int n, q;//n<=2e5; q<=1e5 string S; int nieb, ziel, czer, cp, zp;//odp = (dp[nieb][(czer-ziel+1+3e6)%3]+dp[nieb][(czer-ziel-1+3e6)%3]-(cp==0&&zp==ziel)-(cp==czer&&zp==0)+mod)%mod; int dp[N][3]={1};//dp[k][r] = liczba kombinacji doboru wartosci zbioru k niebieskich, tak aby roznica w nim wynosila r (mod 1e9+7) void dodaj(int i) { if(S[i]=='N') nieb++; if(S[i]=='Z') ziel++, zp+=!(i%2); if(S[i]=='C') czer++, cp+=!(i%2); } void usun(int k) { if(S[k]=='N') nieb--; if(S[k]=='Z') ziel--, zp-=!(k%2); if(S[k]=='C') czer--, cp-=!(k%2); } int odp() { return (dp[nieb][(czer-ziel+1+x3)%3]+dp[nieb][(czer-ziel-1+x3)%3]-(cp==0&&zp==ziel&&(n%2)==1&&n!=1)-(cp==czer&&zp==0&&(n%2)==1&&n!=1)+mod)%mod; } void deb() { cout<<"\n------deb-----\n"; cout<<"Slowo: "<<S<<"\n"; cout<<"Z; C; N: "<<ziel<<"; "<<czer<<"; "<<nieb<<"\n"; cout<<"CP; ZP: "<<cp<<"; "<<zp<<"\n"; cout<<"Czy zielone na parzystych, czerwone na nieparzystych: "<<(cp==0&&zp==ziel)<<"\n"; cout<<"Czy czerwone na parzystych, zielone na nieparzystych: "<<(cp==czer&&zp==0)<<"\n"; cout<<"Wynik: "; } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>q; for(int i=1; i<=n; i++) {//liczenie dp for(int r=0; r<3; r++) dp[i][r]=(dp[i-1][(r+2)%3]+dp[i-1][(r+1)%3])%mod; } cin>>S; for(int i=0; i<S.size(); i++) { dodaj(i); } //odp = (dp[nieb][(czer-ziel+1+x3)%3]+dp[nieb][(czer-ziel-1+x3)%3]-(cp==0&&zp==ziel)-(cp==czer&&zp==0)+mod)%mod;//co gdy opcja z np nie jest dobra? //deb(); cout<<odp()<<"\n"; for(int i=1; i<=q; i++) { int k; char ch; cin>>k>>ch; usun(k-1); S[k-1]=ch; dodaj(k-1); //odp = (dp[nieb][(czer-ziel+1+x3)%3]+dp[nieb][(czer-ziel-1+x3)%3]-(cp==0&&zp==ziel)-(cp==czer&&zp==0)+mod)%mod; //deb(); cout<<odp()<<"\n"; } } |