作为一个括号匹配问题,大意就是一个string包括左括号和右括号,然后这些括号是匹配的,通过这个string可以得出P和W两个数组,即string的另一种表示形式,P表示的是每个右括号左侧有多少左括号,W表示的是每个右括号和与自己匹配的左括号之间有多少个左括号(包括与自己匹配的)
给定P,求W
贴代码:懒得想复杂的解法,就直接从P得到括号字符串,再得到W
/* author FGTmiao
* 2020.5.23
*/
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int t;
int main()
{
scanf("%d", &t);
while (t--)
{
int s[30]; //P数组
int pa[60]; //括号string
int w[30]; //W数组
int len;
scanf("%d", &len);
s[0] = 0;
for (int i = 1; i <= len; i++)
{
scanf("%d", &s[i]);
}
//利用P的差值填
int current = 0;
for (int i = 0; i < len; i++)
{
int lenum = s[i + 1] - s[i];
for (int j = 0; j < lenum; j++)
{
pa[j + current] = -1;//-1 le 1 ri
}
pa[lenum + current] = 1;
current += lenum+1 ;
}
//pa 为括号字符串,根据pa得到W
int w_i = 0;
for (int i = 0; i < len * 2; i++)
{
if (pa[i] == 1)//向左找配对的左括号
{
for (int j = i; j >= 0; j--)
{
if (pa[i] + pa[j] == 0)
{
pa[i] = pa[j] = 0;
int dis = (i - j + 1)/2;//距离
w[w_i] = dis;
w_i++;
break;
}
}
}
}
for (int i = 0; i < len - 1; i++)
{
printf("%d ", w[i]);
}
printf("%d\n", w[len - 1]);
}
return 0;
}