题目大意:利用给定的P串,转换成W串。
P串实际上是根据一个数组模拟出来的,利用模拟出来的字符串,按规则转换。
P:当前)前面的(的个数。
W:当前)前的成对(的数量,包括自身。
一道模拟题,写一写画一画敲一敲,出锅。
先执行循环后判断条件突然忘了do..while结构
AC代码:
#include <iostream>
#include <cmath>
#include <string>
#include <memory.h>
#include <vector>
using namespace std;
typedef long long int LL;
#define MAX 110
#define _for(i,a,b) for(int i = (a); i < (b); i ++)
vector<int> vec;
int readint(){
int x;
cin >> x;
return x;
}
template<class T>
void println(T res){
_for(i,0,res.size()){
cout << res[i];
if( i < res.size()-1 )
cout << " ";
}
cout << endl;
}
vector<int> solve(){
string s;
//获得第一个)前面的(
_for(i,0,vec[0])
s += '(';
s += ')';
//pre 前一个下标对应的(个数
int pre = vec[0];
_for(i,1,vec.size()){
//紧挨着的一对括号
if(vec[i] == pre+1){
s += '(';
s += ')';
}
else{
for(int j = 0; j < vec[i]-pre; j ++)
s += '(';
s += ')';
}
//更新前驱
pre = vec[i];
}
//打印出模拟的括号字符串
//println(s);
//开始p转换成W
//过程:从当前)开始 向前寻找没有匹配过的( 记录对数 除以2 加上自身。
// vis用于记录括号是否已经被匹配了
vector<int> vis(s.size(),0);
vector<int> res;
for(int i = 0; i < s.size(); i ++){
//紧挨着的一对 一定是1
if(i > 0 && s[i] == ')' && s[i-1] == '(' ){
vis[i] = vis[i-1] = 1;
res.push_back(1);
}
else if(s[i] == ')'){
if(i == 0) //避免下标为负值
continue;
int index = i;
/**/ vis[i] = 1; //首尾标记不能忘
int ans = 0;
do{
index --;
if(!vis[index] && s[index] == '(')
break;
if(vis[index] == 1)
ans ++;
}while( true );
/**/ vis[index] = 1;
res.push_back(ans/2+1);
}
}
return res;
}
int main()
{
int t,n;
cin >> t;
while(t--){
cin >> n;
vec.clear();
_for(i,0,n)
vec.push_back(readint());
vector<int> res = solve();
println(res);
}
return 0;
}