#include <bits/stdc++.h> using namespace std; int t[1<<20]; void dodaj(int w,int p,int k,int szp,int szk){ if(szp<=p&&k<=szk){t[w]+=2;return;} int sr=(p+k)/2; if(sr>=szp)dodaj(w<<1,p,sr,szp,szk); if(sr<szk)dodaj(w*2+1,sr+1,k,szp,szk); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n,mro=0; string s; cin>>n; cin>>s; for(int i=0;i<n;++i){//obecna rozpatrywana mrowka if(s[i]=='P')++mro; else if(mro){//mrowki idace w lewo niczego nie napotkaly ++t[i+(1<<19)];++t[i-mro+(1<<19)]; if(mro>1)dodaj(1,1,1<<19,i-mro+2,i); } } for(int i=1;i<(1<<19);++i){t[i*2]+=t[i];t[i*2+1]+=t[i];} for(int i=0;i<n;++i){cout<<t[i+(1<<19)]<<" ";} }
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 | #include <bits/stdc++.h> using namespace std; int t[1<<20]; void dodaj(int w,int p,int k,int szp,int szk){ if(szp<=p&&k<=szk){t[w]+=2;return;} int sr=(p+k)/2; if(sr>=szp)dodaj(w<<1,p,sr,szp,szk); if(sr<szk)dodaj(w*2+1,sr+1,k,szp,szk); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n,mro=0; string s; cin>>n; cin>>s; for(int i=0;i<n;++i){//obecna rozpatrywana mrowka if(s[i]=='P')++mro; else if(mro){//mrowki idace w lewo niczego nie napotkaly ++t[i+(1<<19)];++t[i-mro+(1<<19)]; if(mro>1)dodaj(1,1,1<<19,i-mro+2,i); } } for(int i=1;i<(1<<19);++i){t[i*2]+=t[i];t[i*2+1]+=t[i];} for(int i=0;i<n;++i){cout<<t[i+(1<<19)]<<" ";} } |