poj 1068

原创 2015年11月18日 10:34:21
                                                                                                                              Parencodings
Time Limit: 1000MS   Memory Limit: 10000K

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
题意:(模拟题)

对于给出的原括号串,存在两种数字密码串:

1.p序列:当出现匹配括号对时,从该括号对的右括号开始往左数,直到最前面的左括号数,就是pi的值。

2.w序列:当出现匹配括号对时,包含在该括号对中的所有右括号数(包括该括号对,就是wi的值。

题目的要求:对给出的p数字串,求出对应的w串。

串长限制均为20 题目不难,关键是题目很难读懂,我可能写得比较麻烦。 附上代码: #include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <iomanip> #include <algorithm> #include <iomanip> #include <cmath> using namespace std; int main() {     int t,n,a[25],b[1000],i,cnt,k,j,x[1000],visit[1000],tmp,m;     char c[1000];     cin>>t;     while(t--)     {         cin>>n;         for(i=0;i<n;i++)         {             cin>>a[i];//a数组用来记录pi的值         }         cnt=0;         for(i=0;i<a[0];i++)         {             c[cnt++]='(';//用c数组来模拟出整个括号字符串         }         c[cnt++]=')';         for(i=1;i<n;i++)         {             if(a[i]>a[i-1])             {                 for(k=0;k<a[i]-a[i-1];k++)                 {                     c[cnt++]='(';//如果下一项的值要比该项的值大,那么它们两个的中间肯定增加了a[i]-a[i-1]个左括号                 }                 c[cnt++]=')';             }else{//如果两者相等,直接添加右括号                 c[cnt++]=')';             }         }         for(i=0;i<cnt;i++)         {             b[i]=0;//记录wi的值         }         memset(visit,0,sizeof(visit));//visit数组用来标记,求wi时,我们要找到与“)”最近且没有被匹配过的“(”         for(j=0;j<cnt;j++)         {             if(c[j]==')')             {                 if(c[j-1]=='(')                 {                      b[j]=1;                      visit[j-1]=1;//如果匹配了,那么我们要把这个左括号标记                 }else{                     tmp=1;//不匹配,则要往左寻找与它相匹配的左括号                     for(m=j-1;;m--)                     {                         if(c[m]==')')                         {                             tmp++;                         }else{                             if(!visit[m])//如果找到左括号且没有被标记,那么肯定是可以和它匹配的                             {                                 visit[m]=1;//把它进行标记                                 b[j]=tmp;//把右括号的个数储存到b数组里                                 break;                             }                         }                     }                 }             }         }         k=0;         for(m=0;m<cnt;m++)         {             if(b[m])             {                 x[k++]=b[m];//因为b数组里含有许多0,不方便输出,所以我用了x数组,把b数组非0的值全部进行储存             }         }         for(i=0;i<k-1;i++)         {             cout<<x[i]<<" ";//x数组就是我们要求的wi序列,进行输出         }         cout<<x[k-1]<<endl;     }     return 0; } 总体说我的代码比较麻烦,不过思路很简单,很容易理解,而且耗时也是0ms

POJ 1068模拟题

Parencodings Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24757   ...
  • liang654213
  • liang654213
  • 2016年07月27日 15:59
  • 144

POJ 1068(模拟)

题目链接:http://poj.org/problem?id=1068 题意:一个括号表达式可以按照如下的规则表示,就是每个右括号之前的左括号数。比如(((()()()))),每个右括号之前...
  • rachelsg
  • rachelsg
  • 2016年01月23日 22:44
  • 88

1068. 万绿丛中一点红(20) PAT 乙级

传送门#include #include #include using namespace std;#define MAX_N 1100//typedef long long ll;int img[...
  • SY_Yu
  • SY_Yu
  • 2017年03月28日 10:00
  • 747

POJ 1068 解题报告

这道题就是按照题意模拟做出来的,主要是数据量很小。通过输入的p可以确定括号序列,然后按照次序注意处理,左括号压栈,右括号入栈,同时统计w值。 1068 Accepted 248K...
  • thestoryofsnow
  • thestoryofsnow
  • 2014年12月04日 11:12
  • 262

poj 1068解题报告

大概题意为: 对于一段括号序列,有两种遍历方式 其中方式p为每遇到一个右括号就输出其前面有多少个左括号 方式w为每遇到一个右括号就输出在他和自己匹配的左括号之间有多少个右括号(包括自己) 现在...
  • firechungelaile
  • firechungelaile
  • 2013年05月14日 20:53
  • 578

PAT-B1068. 万绿丛中一点红

1068. 万绿丛中一点红(20)对于计算机而言,颜色不过是像素点对应的一个24位的数值。现给定一幅分辨率为MxN的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围...
  • lUNATICF
  • lUNATICF
  • 2017年03月28日 10:23
  • 359

POJ(1068)(模拟)(栈)思想

Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two different ways: ...
  • u013519020
  • u013519020
  • 2014年07月27日 20:29
  • 300

【基础练习】【背包DP】codevs1068 乌龟棋题解

题目来自2010NOIP提高组 题目描述 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是...
  • ametake
  • ametake
  • 2015年08月13日 10:43
  • 1511

POJ 1068 Parencodings (模拟),暑假第一题~

终于考完高线大,头也不那么疼了,也终于有空来刷题了~,先来一发水题试试水 题目链接:http://poj.org/problem?id=1068 简单的模拟,麻烦在理解题意,,英语好的请无视这句;...
  • chaiwenjun000
  • chaiwenjun000
  • 2015年07月21日 15:39
  • 836

1068依赖服务或组无法启动

起因: 就是我再怎么修炼,怎样淡然,突然遭遇不能上网,也是要暴跳如雷,歇斯底里的。 之前不经常使用翻墙软件,昨天心血来潮翻墙想看看外国的月亮,但是刚翻出去没多久,我本地的网就成功挂掉了。有线、无线...
  • mayfla
  • mayfla
  • 2017年03月07日 10:02
  • 782
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1068
举报原因:
原因补充:

(最多只允许输入30个字)