POJ1068 Parencodings(模拟)
题目链接。
分析:
水题。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 100; int P[maxn], W[maxn]; char s[maxn]; int main(){ int T, n, m; scanf("%d", &T); while(T--) { scanf("%d", &n); P[0] = 0; for(int i=1; i<=n; i++) scanf("%d", &P[i]); //通过P推s int cn = 0; for(int i=1; i<=n; i++) { for(int j=0; j<P[i]-P[i-1]; j++) { s[cn++] = '('; } s[cn++] = ')'; } s[cn++] = '\0'; //通过s推W int rp_cnt = 0, lp_cnt, t, ls_cnt; for(int i=0; i<cn; i++) { if(s[i] == ')') { rp_cnt++; lp_cnt = t = ls_cnt = 0; for(int j=i; j>=0; j--) { if(s[j] == ')') { t++; ls_cnt++; } else if(s[j] == '(') lp_cnt++; if(lp_cnt == ls_cnt) break; } W[rp_cnt] = t; } } for(int i=1; i<=n; i++) { if(i != n) printf("%d ", W[i]); else printf("%d\n", W[i]); } } return 0; }