POJ-1068 Parencodings

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

猜你喜欢

转载自blog.csdn.net/a673786103/article/details/80260089