zoukankan      html  css  js  c++  java
  • 括号编码

    括号编码

     
    Time Limit : 1000 MS   Memory Limit : 65536 KB
     

    Description

    S = s1 s2...s2n 是一个符合格式的括号的字符串,S能按下面两种方式编码:
    P编码:编码是一个整数序列P = p1 p2...pn,pi是第i个右括号之前的左括号的数目。
    W编码:编码是一个整数序列W= p1 p2...pn,wi是第i个右括号的编码值,它等于这个右括号到与之匹配的左括号之间的右括号的数目(包括它自己)。
    比如:

    S

    (

    (

    (

    (

    )

    (

    )

    (

    )

    )

    )

    )

    P

     

     

     

     

    4

     

    5

     

    6

    6

    6

    6

    W

     

     

     

     

    1

     

    1

     

    1

    4

    5

    6

    请写一个程序将P序列转换成W序列。


    输入:

    第一行是一个整数K,表示有多少个测试用例,以后每两行一个测试用例。每个测试用例第一行为一个整数n(1 <= n <= 20),表示P序列长度,每个测试用例第二行n个非负整数,每个整数之间有一个空格分隔。


    输出:

    每行输出一个测试用例的结果。每行包括n个整数,每个整数之间用一个空格分隔。

     

    Sample Input

    264 5 6 6 6 694 6 6 6 6 8 9 9 9
     

    Sample Output

    1 1 1 4 5 61 1 2 4 5 1 1 3 9
    
    
    
    
    参考代码:
    #include<iostream>
    #include<cstdio>
    using namespace std;
    int a[1000],stack[1000],count[1000];
    char str[1010];
    int main()
    {
        int cases,n,t,i,j,s,sum,top;
        cin>>cases;
        while(cases--)
        {
            cin>>n;
            s=0;a[0]=0;sum=0;
            for(i=1;i<=n;i++)
            {
                cin>>a[i];
                t=a[i]-a[i-1];
                for(j=1;j<=t;j++)
                {
                    str[++s]='(';
                    count[s]=sum;
                }
                str[++s]=')';sum++;count[s]=sum;
            }
            top=0;
            for(i=1;i<s;i++)
            {
                if(str[i]=='(')  stack[++top]=i;
                else  printf("%d ",count[i]-count[stack[top--]]);
            }
            printf("%d
    ",count[i]-count[stack[top--]]);
        }return 0;
    }


  • 相关阅读:
    LeetCode 225. 用队列实现栈 做题笔记
    杨辉三角
    字母图形
    01字符串
    圆的面积
    饮料和啤酒
    进制转换
    从今天起 复习算法
    乘法群
    Paillier同态加密的介绍以及c++实现
  • 原文地址:https://www.cnblogs.com/tufujie/p/4854253.html
Copyright © 2011-2022 走看看