题目链接
思路:
- 又是一道一题啦,看似比较复杂还是没什么难的,一步步写出来就行了。
- 我采用的方法是将 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;
}