题目链接:http://acm.tju.edu.cn/toj/showp.php?pid=1242
题目大意:括号匹配问题,给定两个串:第一个串中每个数表示第i个右括号坐边的左括号数,第二个串中的每个数表示与第i个右括号匹配的左括号号的位置(从右往左,且只计算左括号,例如,它如果是该右括号坐标的第一个左括号,它的值就是1,是第二个左括号,它的值就是2,以此类推)
思路:妹啊,读题都读了好久才读懂- -! 然后就开始写,先想办法把括号字符串还原,再从括号字符串出发生成第二个串。 要单从两个串中找关系的话,没有多想,感觉智商已然不够用。
代码:
//toj1242 括号匹配
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
char s[50];
int a,i,j,l,cas;
int main()
{
cin>>cas;
while(cas--)
{
int n,len=0,tmp=0;
//构造括号字符串
cin>>n;
for(i=0;i<n;i++)
{
cin>>a;
for(j=len;j<len+a-tmp;j++)
s[j] = '(';
s[len+a-tmp] = ')';
len+=a-tmp+1;
tmp = a;
}
//将括号字串生成第二个字符串
int flag[50];
memset(flag,0,sizeof(flag));
int m = 0;
for(i=0;i<len;i++)
{
int num = 1; //初始化为1方便些,即遇到没有标记的括号的时候,只需把flag标记为1就行了
if(s[i]==')')
{
for(j=i;j>=0;j--)
{
if(s[j]=='(' && flag[j]==1) num++;
else if(s[j]=='(' && !flag[j] )
{
flag[j]=1;
break;
}
}
cout<<num;
m++;
if(m!=n)
cout<<" ";
}
}
cout<<endl;
}
return 0;
}
还做过其他括号匹配的题目,后面陆续上传分类