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("
");
    }
}
原文地址:https://www.cnblogs.com/liumengyue/p/5616691.html