天梯赛——7-9 解密邀请码 (20 分)

HBU开设了一门全网独一份的新课程,因此大家迫不及待的等待选课的到来以求选到该课程,但是在选择前需要输入课程的邀请码,任何申请该课程的同学都会收到一个神秘字符串,为了保障字符串的安全性以及自己的课程不被窃取,课程老师发明了一种压缩算法对邀请码中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m∣S,例如字符串HBUHBUHBU将会被压缩为[3∣HBU],现在同学们收到了课程的邀请码字,你能帮助他们进行解密么?

输入格式:
输入一个字符串S(∣S∣≤50),S展开后可能含有大写字母、小写字母与数字, 题目保证输入的字符串合法以及展开后的字符串长度不超过10
6
且展开后的邀请码中不含∣

输出格式:
输入样例:

HB[3|U[2|HB]]U

结尾无空行
输出样例:

HBUHBHBUHBHBUHBHBU

结尾无空行
说明 HB[3|U[2|HB]]U−>HB[3|UHBHB]U−> HBUHBHBUHBHBUHBHBU
AC代码

#include<bits/stdc++.h>

using namespace std;
const int MAX=1e6+5;

int main(){
	string s;
	cin>>s;
	stack<int> op,num;
	for(auto c:s){
		if(c=='|'){
			int m=0,w=1;
			while(isdigit(op.top())){
				m+=(op.top()-'0')*w;
				w=w*10;
				op.pop();
			}
			num.push(m);
		}
		else if(c==']'){
			int t=0;
			char s1[MAX];
			while(op.top()!='['){
				s1[t++]=op.top();
				op.pop();
			}
			op.pop();
			for(int i=0;i<num.top();i++){
				for(int j=t-1;j>=0;j--) op.push(s1[j]);
			}
			num.pop();
		}
		else op.push(c);
	}
	char s1[MAX];
	int t=0;
	while(op.size()){
		s1[t++]=op.top();
		op.pop();
	}
	for(int i=t-1;i>=0;i--) cout<<s1[i];
	return 0;
}

22寒假重做发现一个事,下面代码会有两个测试点过不去

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int main()
{
	string s;
	stack<int> num;
	stack<char> op;
	cin>>s;
	for(int i=0;i<s.size();i++){
		if(s[i]=='|'){
				int m=0,w=1;
				while(isdigit(op.top())){
					m+=(op.top()-'0')*w;
					w=w*10;
					op.pop();
				}
				num.push(m);
			}
		else if(s[i]==']'){
			int t=0;
			char s1[N];
			while(op.top()!='['){
				s1[t++]=op.top();
				op.pop();
			}
			op.pop();
		
			for(int q=0;q<num.top();q++){
				for(int j=t-1;j>=0;j--) op.push(s1[j]);
			}
			num.pop();
			
		}
		else op.push(s[i]);
			
	}
	string ss;
	while(op.size()){
		ss=op.top()+ss;
		op.pop();
	}
	cout<<ss<<endl;
	return 0;
}

问题在于结尾

string ss;
	while(op.size()){
		ss=op.top()+ss;
		op.pop();
	}
	cout<<ss<<endl;

ss=op.top()+ss会超时,改成ss+=op.top()就不超时了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值