#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)]<<" ";} } |
English