Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 9010 | Accepted: 5321 |
Description
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
Output
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
我的理解:
明白括号串两种表示方法的具体内容,通过"栈"合理将第一种表示方法转向第二种表示方法。
我的代码:
/**
*
* POJ 1068 Parencodings
* 括号匹配问题. 已知描述括号串的两种问题。
* 方法1:对应每个右括号前面左括号的个数
* 方法2:相当于每个右括号,内层的左括号的个数
*/
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace std;
string str=""; // 记录括号序列
// 计算右括号内层的左括号数
int count( int index )
{
int i;
int cnt=0;
for( i=index-1; i>=0; i-- )
{
if( str[i]=='(' ) // 如果遇到左括号则与当前右括号匹配
{
str.erase( str.begin() + i ); // 删除当前左括号
break;
}
else if( str[i]==')' ) // 右括号
{
cnt++; // 计数器叠加
}
}
return cnt+1; // 返回
}
// 求解函数
void function()
{
int i;
bool flag = false;
for( i=0; i<str.length();) // 遍历当前括号串
{
if( str[i]==')' ) // 遇到右括号输出相应结果
{
if( flag==true)
cout<<" ";
cout<<count(i); //
flag=true;
}
else
{
i++;
}
}
cout<<endl;
}
int main()
{
// ifstream cin("test.txt");
int n; // 测试数据的组数
int m; // 描述括号状态的整数
int state; // 括号状态描述变量
int i,j; // 循环变量
cin>>n; // 获取测试数据数
while( n-- )
{
str="";
cin>>m; // 获取m
int last=0; // 记录上一个括号状态量
// 生成括号串
for( i=0; i<m; i++ )
{
cin >> state; // 获取state
j=0;
while( j< (state-last) )
{
str+="(";
j++;
}
last = state;
str+=")";
}
function();
}
return 0;
}