模拟 --- 简单括号匹配

Parencodings










Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 19067   Accepted: 11502

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

【题目来源】

Tehran
2001

http://poj.org/problem?id=1068

【题目大意】

给你一串数字,每个数字的位置都是一个右括号,并且本身的值表示该右括号的左边有多少左括号。

现在要你匹配这些右括号,输出一列数字,这些数字表示该右括号到达与该右括号匹配的左括号这一段中有多少个左括号。

翻译得太差强人意了,有时候题意只可意会,不可言传==||

【题目分析】

题目很简单,直接模拟就可。

AC代码:


#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#define MAX 100000
using namespace std;
struct Node
{
bool lor;
bool vis;
};
Node node[100000];
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
int i,j;
int a[25];
for(i=0;i<MAX;i++)
node[i].vis=false;
cin>>n;
a[0]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int index=-1;
int temp;
for(i=1;i<=n;i++)
{
temp=a[i]-a[i-1];
for(j=0;j<temp;j++)
{
node[++index].lor=0;
}
node[++index].lor=1;
}
// cout<<index<<endl;
// for(i=0;i<=index;i++)
// printf("%d ",node[i].lor);
// puts("");
int cnt;
int ans[MAX];
int index1=-1;
for(i=0;i<=index;i++)
{
cnt=0;
if(node[i].lor==1)
{
for(j=i;j>=0;j--) //倒过来数
{
if(node[j].lor==0)
{
cnt++;
if(!node[j].vis)
{
node[j].vis=true;
ans[++index1]=cnt;
// cout<<"cnt="<<cnt<<endl;
break;
}
}
}
}
cnt=0;
}
// cout<<"index1="<<index1<<endl;
for(i=0;i<=index1;i++)
{
if(i==0)
cout<<ans[i];
else
cout<<" "<<ans[i];
}
puts("");
}
return 0;
}

模拟 --- 简单括号匹配

时间: 2024-10-21 14:07:24

模拟 --- 简单括号匹配的相关文章

leetcode 20 简单括号匹配

栈的运用 1 class Solution { 2 public: 3 bool isValid(string s) { 4 stack<char>The_Stack; 5 int i=0; 6 The_Stack.push('#'); 7 while(i<s.size()) { 8 if((s[i]==')'&&The_Stack.top()=='(')||(s[i]==']'&&The_Stack.top()=='[')||(s[i]=='}'&

括号匹配_进阶篇 ( 7-2 符号配对 )

括号匹配_进阶篇(/.../) 之前有个简单的括号匹配,令这三对括号进行匹配:( ),[ ],{ } 点击跳转:简单的括号匹配问题 之所以说他们简单,是因为每个括号都只占一个字符. 而进阶篇,虽然说起来很酷,其实就是再多一个对/* */的判断 先上原题 7-2 符号配对 (20 分) 请编写程序检查C语言源程序中下列符号是否配对:/*与*/.(与).[与].{与}. 输入格式: 输入为一个C语言源程序.当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束.程序中需要检查配对的符号不超过1

STL版 括号匹配(感觉不如之前自己用数组模拟的跑的快)

数据结构实验之栈四:括号匹配 Time Limit: 1000MS Memory limit: 65536K 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出“yes”,不匹配输出“no” 示例输入 sin(20+10) {[}] 示例输出 yes no 注意:读入的字符串里可能含有空格哦! #include <iostream> #i

华为上机练习题--括号匹配检测

题目: 输入一串字符串,其中有普通的字符与括号组成(包括'('.')'.'[',']'),要求验证括号是否匹配,如果匹配则输出0.否则输出1. Smple input:dfa(sdf)df[dfds(dfd)]    Smple outPut:0 分析: 类似于括号字符匹配这类的问题, 我们可以模拟栈的操作来进行验证, 这样问题就简单了, 就是栈的操作 代码如下: package com.wenj.test; import java.util.ArrayList; import java.uti

poj 2955 Brackets 括号匹配 区间dp

题意:最多有多少括号匹配 思路:区间dp,模板dp,区间合并. 对于a[j]来说: 刚開始的时候,转移方程为dp[i][j]=max(dp[i][j-1],dp[i][k-1]+dp[k][j-1]+2), a[k]与a[j] 匹配,结果一组数据出错 ([]]) 检查的时候发现dp[2][3]==2,对,dp[2][4]=4,错了,简单模拟了一下发现,dp[2][4]=dp[2][1]+dp[2][3]+2==4,错了 此时2与4已经匹配,2与3已经无法再匹配. 故转移方程改为dp[i][j]=

小辉浅谈括号匹配问题

括号匹配是很久以前的一个题,但是以前没有做出来 ,今天看数据结构,发现可以用栈做,比数组要简单的多,首先讲一下这个括号匹配时什么问题,其实就是一个简单的模拟题. 大致体一是这样的 [()()],就是语法判断你的括号符不符合规定  ,以前是想数组模拟一下,但是感觉有点烦,一直没有做,(这种还是不要学,)今天讲完数据结构,发现用栈很好写,吃完饭就写了一下,自己测了几个样例都过了 ,后面有做了一下优化,大致是这个意思 字有点弱,还能看清  ,大约就是这个意思 还可以作一点剪枝 就是这个字符串是奇数长度

POJ 2955 Brackets (区间dp 括号匹配)

Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3951   Accepted: 2078 Description We give the following inductive definition of a "regular brackets" sequence: the empty sequence is a regular brackets sequence, if s is a reg

C++之桟的应用---括号匹配

刚开始学习数据结构,用桟写了一个经典的应用,括号匹配. 算法思路: 输入字符串时,将 '(' , '['  压入桟,遇到 ')'  ']'  时,再栈顶出桟,进行括号匹配,如果成功匹配,则继续进行,否则,程序结束,输入不匹配信息, 如果 ')' ']' 均匹配,则看判断桟是否为空,如果为空,则输入匹配,否则,输出符号数量不匹配. #include<iostream> using namespace std; #define max 100 struct stack { int Top; int

数据结构笔记之——括号匹配(栈的应用之一)(SDOJ 2134)

//  度过了上周的悲催状态,我决定好好学习了-- //书上括号匹配是栈的简单应用,正好在SDOJ上看到这道题,顺便做了下 题目地址:SDOJ 2134 数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出