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