当前位置: 代码迷 >> 综合 >> POJ1068 Parencodings(模拟,括号问题)
  详细解决方案

POJ1068 Parencodings(模拟,括号问题)

热度:74   发布时间:2023-11-08 17:01:25.0

POJ1068
题意:
为给一个只包含括号的字符串加密有两种方法:
方法一:用p数组表示,p[i]为第i个右括号左边一共有多少左括号
方法二:用w数组表示,w[i]表示当第i个括号左右匹配时,一共包括多少右括号
要求给定加密后的p数组,求出w数组。

思路分析:
可以根据给的p数组先求出字符串s, p[i]-p[i-1]为第i个右括号紧跟在它前面的有多少个左括号,求出s
遍历s,每次找到右括号,然后回溯,遇到右括号就计数(回溯前找到的那个也算),直到遇到与它匹配的左括号(vis[]=0),因为一个右括号有唯一的左括号匹配,所以一旦找到它的左括号,就用vis[]=1标记下。

模拟:

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int p[110],w[110];
bool vis[110];int main(){int t,n;cin>>t;while(t--){string s;cin>>n; //一共有n对括号for(int i=1;i<=n;i++)cin>>p[i];p[0]=0;  //有助于后面构造s串for(i=1;i<=n;i++){
   //构造s串for(int j=1;j<=(p[i]-p[i-1]);j++)s+="(";s+=")";}int k=1;memset(vis,false,sizeof(vis));for(i=0;i<2*n;i++){int cnt=1;if(s[i]==')'){for(int j=i-1;j>=0;j--){ //回溯if(s[j]==')')  cnt++;if(s[j]=='(' &&!vis[j]){vis[j]=true;break;}}w[k++]=cnt;}}for(i=1;i<=n;i++)cout<<w[i]<<" ";cout<<endl;}return 0;
}