ZOJ Problem Set - 1016 Parencodings
Let S = s1 s2 ... s2n be a well-formed string of parentheses. S can be encoded in two different ways:
- 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).
- 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 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
Source: Asia 2001, Tehran (Iran)
題目大意:
把P編碼轉為W編碼。
P編碼的每個數字記錄的是左邊有多少個左括號
W編碼的每個數字記錄的是左邊遇到的和它相匹配的左括號時經過的左括號個數
解題思路:
用堆疊來解題。每一次輸入P的一位數字的時候,用堆疊來模擬括號,其中-1表示左括號,1表示右括號。每次輸入P的一位數字之後,我們將這麼多位左括號(-1)入棧,判斷棧頂為1還是-1,如果為-1則W輸出1,否則持續出棧直到遇到-1,則輸出累加的數字+1。
AC:
#include <cstdio>
#include <string>
#include <stack>
#include <iostream>
using namespace std;
stack<int> S;
int main()
{
int N;
cin>>N;
while(N--)
{
int n;
cin>>n;
int p;
int t = 0;//記錄已經輸入的左括號數(當前P的前序)
for(int i = 1; i <= n; i++)
{
cin>>p;
for(int j = 1; j <= p - t; j++)
S.push(-1); //將左括號全部入棧
if(S.top() == -1) //判斷,如果棧頂元素為-1,則輸出1
{
i == 1 ? cout<<"1" : cout<<" 1";
S.pop(); //並出棧-1,入棧1
S.push(1);
}
else //如果棧首不是-1,則開始計算前面有多少對括號
{
int iTop = S.top();//直接出棧棧首
S.pop();
while(S.top() != -1)//持續pop,直到遇到-1
{
iTop += S.top();
S.pop();
}
cout<<" "<<iTop + 1;
S.pop();
S.push(iTop + 1);
}
t = p;
}
cout<<endl;
while(!S.empty())
S.pop();
}
system("pause");
return 0;
}
相關文章
- ZOJ Problem Set - 1094 Matrix Chain MultiplicationAI
- ZOJ Problem Set - 3708 Density of Power Network
- POJ——1016Parencodings(模擬)Encoding
- ZOJ Problem Set - 1944 Tree Recovery(二叉樹三種遍歷知二求三)二叉樹
- 11.2.0.2 Patch Set - List of Bug Fixes by Problem Type
- 11.1.0.7 Patch Set - List of Bug Fixes by Problem Type (文件 ID 601739.1)
- 11.2.0.4 Patch Set - List of Bug Fixes by Problem Type (Doc ID 1562142.1)
- 10.2.0.5 Patch Set - List of Bug Fixes by Problem Type (文件 ID 1088172.1)
- Parencodings(POJ 1068)(模擬)Encoding
- Problem_2 Majority Problem
- CF1016D
- ZOJ First Digit(瞎搞)Git
- Diablo III ZOJ - 3769
- HDU 1016 java 已AcJava
- Mathematical Problem
- ZOJ 3732 Graph ReconstructionStruct
- ZOJ 1048 Financial ManagementNaN
- FZU Problem 1692 Key problem(迴圈矩陣)矩陣
- ZOJ 3789 Gears(並查集)並查集
- ZOJ 1013 Great Equipment(DP)UI
- ACM A problem is easyACM
- Database Transaction ProblemDatabase
- Yet Another Problem
- 1016 部分A+B (15 分)JavaJava
- Codeforces 1016C Vasya And The MushroomsOOM
- ZOJ 3875 Lunch Time(結構體排序)結構體排序
- ZOJ 2745 01-K Code(DP)(轉)
- POJ 1068-Parencodings(模擬-包含括號個數)Encoding
- Fixed "There was a problem with the editor 'vi'"
- STL iterator delete problemdelete
- E. Not a Nim Problem
- 動態規劃-ZOJ 1 163 THE STAIRCASES動態規劃AI
- ZOJ 4846 GCD Reduce (數學分析題)GC
- ZOJ Consecutive Blocks(左右指標移動)BloC指標
- zoj 1093 dp Monkey and BananaNaN
- 1016 部分A+B (15分)【java題解】Java
- HDU 1792 A New Change Problem
- Joe Harris is a real problem with this team