poj 1068--Parencodings
Posted いとう かいじ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 1068--Parencodings相关的知识,希望对你有一定的参考价值。
S (((()()())))
P-sequence 4 5 6666
W-sequence 1 1 1456
题目大意:给定一个序列P,代表这个序列中一共有n对括号,第i个右括号左边有Pi个左括号,要求求出序列w,序列w表示第i个右括号所组成的一对括号中有Wi对括号(包括本身)
思路:先把P序列转化为括号序列,然后从左向右找右括号,从这个括号向左找第一个左括号,把能和它配对的左括号一并删除(中间一定没有别的括号存在)
#include<iostream> #include<cstdio> using namespace std; int a[30];//恢复的括号序列,1表示左括号,2表示右括号 int b[30]; int T,n,x,cnt; int main() { scanf("%d",&T); for (int I = 1;I <= T;I++) { cnt = 0; scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&x); a[x+i] = 2; } for (int i=1;i<=n*2;i++) if (!a[i]) a[i] = 1; for (int i=1;i<=n*2;i++) if (a[i] == 2) { a[i] = 0; cnt ++; //右括号个数,编号 for (int j=i-1;j>=1;j--) { if (a[j] == 1) { b[cnt] = (i-j+1)/2; a[j] = 0; break; } a[j] = 0; } } for (int i=1;i<=cnt;i++) printf("%d ",b[i]); printf("\n"); } }
以上是关于poj 1068--Parencodings的主要内容,如果未能解决你的问题,请参考以下文章