#include <bits/stdc++.h>
using namespace std;
const int base = 512 * 1024;
int tree[base * 2];
inline void add(int l,int p,int x){
l+=base - 1;
p+=base + 1;
while(l / 2 != p / 2){
if(l % 2 == 0){
tree[l + 1]+=x;
}
if(p % 2 == 1){
tree[p - 1]+=x;
}
l/=2;
p/=2;
}
}
inline int query(int v){
int x = 0;
v+=base;
while(v > 0){
x+=tree[v];
v/=2;
}
return x;
}
int main(){
cin.tie(0);
ios_base::sync_with_stdio(0);
int n;
cin>>n;
int cnt = 0;
string W;
cin>>W;
for(int i = 0; i < W.size() - 1;++i){
if(W[i] == 'P'){
++cnt;
}
if(W[i + 1] == 'L' && cnt != 0){
if(cnt == 1){
add(i,i,1);
add(i + 1,i + 1,1);
}else{
add(i - cnt + 2,i,2);
add(i - cnt + 1,i - cnt + 1,1);
add(i + 1,i + 1,1);
}
}
}
for(int i = 0; i < n;++i){
cout<<query(i) <<" ";
}
}
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 | #include <bits/stdc++.h> using namespace std; const int base = 512 * 1024; int tree[base * 2]; inline void add(int l,int p,int x){ l+=base - 1; p+=base + 1; while(l / 2 != p / 2){ if(l % 2 == 0){ tree[l + 1]+=x; } if(p % 2 == 1){ tree[p - 1]+=x; } l/=2; p/=2; } } inline int query(int v){ int x = 0; v+=base; while(v > 0){ x+=tree[v]; v/=2; } return x; } int main(){ cin.tie(0); ios_base::sync_with_stdio(0); int n; cin>>n; int cnt = 0; string W; cin>>W; for(int i = 0; i < W.size() - 1;++i){ if(W[i] == 'P'){ ++cnt; } if(W[i + 1] == 'L' && cnt != 0){ if(cnt == 1){ add(i,i,1); add(i + 1,i + 1,1); }else{ add(i - cnt + 2,i,2); add(i - cnt + 1,i - cnt + 1,1); add(i + 1,i + 1,1); } } } for(int i = 0; i < n;++i){ cout<<query(i) <<" "; } } |
English