• poj 1068(模拟题)


    Parencodings
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 23545   Accepted: 13802

    Description

    Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two different ways:
    q By an integer sequence P = p1 p2...pn where pi is the number of left parentheses before the ith right parenthesis in S (P-sequence).
    q By an integer sequence W = w1 w2...wn where for each right parenthesis, say a in S, we associate an integer which is the number of right parentheses counting from the matched left parenthesis of a up to a. (W-sequence).

    Following is an example of the above encodings:

    S (((()()())))
    P-sequence 4 5 6666
    W-sequence 1 1 1456

    Write a program to convert P-sequence of a well-formed string to the W-sequence of the same string.

    Input

    The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case is an integer n (1 <= n <= 20), and the second line is the P-sequence of a well-formed string. It contains n positive integers, separated with blanks, representing the P-sequence.

    Output

    The output file consists of exactly t lines corresponding to test cases. For each test case, the output line should contain n integers describing the W-sequence of the string corresponding to its given P-sequence.

    Sample Input

    2
    6
    4 5 6 6 6 6
    9 
    4 6 6 6 6 8 9 9 9
    

    Sample Output

    1 1 1 4 5 6
    1 1 2 4 5 1 1 3 9

    思路:简单回溯即可;
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cstdlib>
    #include<iomanip>
    #include<cmath>
    #include<vector>
    #include<queue>
    #include<stack>
    using namespace std;
    #define PI 3.141592653589792128462643383279502
    int main(){
        freopen("in.txt","r",stdin);
        int t,n,m,c,p[30],pp[30];
        bool w[50];
        cin>>t;
        while(t--){
            memset(w,true,sizeof(w));
            cin>>n;
            c=1;
            for(int i=1;i<=n;i++){
                cin>>m;
                w[m+i]=false;
                p[c++]=m+i;
            }
            int k=0,b=0,kk;
            for(int i=1;i<c;i++){
                kk=p[i];
                for(int j=kk;j>=1;j--){
                    if(w[j]==false)
                        k++;
                    else
                        b++;
                    if(b-k==0) {
                        pp[i]=k;
                        k=0;b=0;
                        break;
                    }
                }
            }
            for(int i=1;i<c;i++){
                if(i!=1)cout<<" ";
                cout<<pp[i];
            }
            cout <<endl;
        }
        return 0;
    }
  • 相关阅读:
    简单工厂、工厂方法、抽象工厂
    c#之反射总结
    设计模式Builder(建造者)模式
    c#之委托和事件的区别
    c#之委托总结
    javascript之流程控制 和函数的容易忽略点
    javascript之六种数据类型以及特殊注意点
    Sublime Text 快捷键
    链接中获取文件名
    js 获取当天23点59分59秒 时间戳 (最简单的方法)
  • 原文地址:https://www.cnblogs.com/yoyo-sincerely/p/5052494.html
Copyright © 2020-2023  润新知