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()就不超时了。