hdu 1361 Parencodings 简单模拟

Parencodings

题意:

由括号序列S可经P规则和W规则变形为P序列和W序列。

p规则是:pi是第i个右括号左边的左括号的数;

w规则是:wi是第i右括号与它匹配的左括号之间右括号的数(其中包括它本身)。

题解:

这题真的好简单,数据也小,算是一个增加了我信心的题吧。 1是左括号,2是右括号。

代码:

#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long ll;
#define PU puts("");
#define PI(A) printf("%d
",A)
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d%d",&(N),&(M))
#define cle(a,val) memset(a,(val),sizeof(a))
#define rep(i,b) for(int i=0;i<(b);i++)
#define Rep(i,a,b) for(int i=(a);i<=(b);i++)
#define reRep(i,a,b) for(int i=(a);i>=(b);i--)
const double EPS= 1e-9 ;

/*  /////////////////////////     C o d i n g  S p a c e     /////////////////////////  */

const int MAXN= 20 + 9 ;
int N;
vector<int > vei;
int main()
{
    int T;
    SI(T);
    while(T--)
    {
        SI(N);
        int k=1;
        rep(i,N)
        {
            int x;
            SI(x);
            for (int j=k;j<=x;j++)
            {
                vei.push_back(1);
            }
            vei.push_back(2);
            k=x+1;
        }
        vector<int > vere;
        int d=vei.size();
        for (int i=d-1;i>=0;i--)
        {
            if (vei[i]==2)
            {
                int ans=0;
                int cnt1=0,cnt2=0;
                for (int u=i;u>=0;u--)
                {
                    if (vei[u]==2)
                    {
                        cnt2++;
                        ans++;
                    }
                    else
                    {
                        cnt1++;
                    }
                    if (cnt1==cnt2) break;
                }
                vere.push_back(ans);
            }
        }
        for (int i=vere.size()-1;i>=0;i--) printf("%d%c",vere[i],i==0?'
':' ');
        vei.clear();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/s1124yy/p/5701604.html