题目大意:利用给定的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; }