| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 18825 | Accepted: 11348 |
Description
S (((()()()))) P-sequence 4 5 6666 W-sequence 1 1 1456
Input
Output
Sample Input
2 6 4 5 6 6 6 6 9 4 6 6 6 6 8 9 9 9
Sample Output
1 1 1 4 5 6 1 1 2 4 5 1 1 3 9
题目意思:P序列是右括号前面的左括号数目,W序列是每个右括号和与它匹配的左括号之间包含的配对括号数目(包含自身)。
解题思路:用数组数值模拟左右括号,-1代表左括号,1代表右括号。从头开始寻找右括号,然后往前找到和它匹配的左括号,把它置为0,统计它们之间0的个数,得到答案。
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 1005
int main()
{
int T,i,j,k,t,si,n,a[N],f[N],ans[N];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
a[0]=0;
memset(f,0,sizeof(f)); //数组初始化
si=1;
for(i=1;i<=n;i++)
{
t=a[i]-a[i-1]; //新增加的左括号个数
for(j=si;j<t+si;j++)
f[j]=-1;
si+=t;
f[si++]=1; //si记录起点位置
}
for(i=1,k=0;i<si;i++)
{
if(f[i]==1) //找到一个未配对右括号
{
for(j=i-1;j>0;j--)
{
if(f[j]==-1) //找到相匹配的左括号
{
f[j]=0;
break;
}
}
for(t=0;j<i;j++) //统计他们之间包含的配对括号数目
if(f[j]==0)
t++;
ans[k++]=t;
}
}
for(i=0;i<k-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[k-1]);
}
return 0;
}
poj 1068 Parencodings,布布扣,bubuko.com
原文:http://blog.csdn.net/u011721440/article/details/23181873