POJ 1068【Parencodings】

13 篇文章 0 订阅
10 篇文章 0 订阅

题目链接

思路:

  • 又是一道一题啦,看似比较复杂还是没什么难的,一步步写出来就行了。
  • 我采用的方法是将 P编码 解码成括号串,再计算出 W编码
  • 可能重编码时候需要先想好怎么算吧,利用每段匹配括号内左右各半的性质也许v会好解一些。

另一种思路(借鉴):

  • 使用 stack<int>

  • 同样先解码出字符串,然后从左到右依次处理每个括号,如果是左括号则入栈 sta.push(1),右括号则 t = sta.top() ; sta.pop()s.top() += t ;

  • 至于为什么这样,写两笔就懂了。要多想。

代码:

  • 第一种思路:660K 0MS
//660K		0MS


#include <iostream>

using namespace std;

const int maxn = 28;

int p[maxn/2];
int w[maxn/2];
char parenthesis[maxn];

int main(){
	int T;cin>>T;
	while(T--){
		int n;
		cin>>n;
		int t=0;
		int lnum=0;
		for(int i=1;i<=n;i++){
			cin>>p[i];
			while(lnum < p[i]){
				parenthesis[t++] = '(';
				lnum++;
			}
			parenthesis[t++] = ')';
			int rnum = 0;
			int k;
			for(k=t-2;k>=0;k--){
				if(parenthesis[k] == '(' && !rnum)
					break;
				else if(parenthesis[k] == ')')
					rnum++;
				else if(parenthesis[k] == '(')
					rnum--;
			}
			cout<<(t - k) / 2<<' ';
		}
		cout<<endl;
	}
	return 0;
}
  • 第二种思路:656K 0MS
//656K		0MS


#include <iostream>
#include <stack>

using namespace std;

string str;
stack<int> sta;

int main(){
	int T;cin>>T;
	while(T--){
		str.clear();
		int n;
		int lnum = 0;
		
		cin>>n;
		while(n--){
			int p;
			cin>>p;
			while(lnum < p){
				str += '(';
				lnum++;
			}
			str += ')';
		}
		
		for(string::iterator i = str.begin() ; i != str.end() ; i++){
			if(*i == '(')
				sta.push(1);
			else{
				int t = sta.top();sta.pop();
				cout<<t<<' ';
				if(!sta.empty())
					sta.top() += t;
			}
		}
		
		cout<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值