http://acm.pku.edu.cn/JudgeOnline/problem?id=1068
这道题目是一道模拟题。P-sequence表示第i个‘)’之前有几个‘(’,W-sequence表示第i个‘()’包含几对‘()’,要求对应P的W。题目中没有要输出S,故‘(’‘)’可以分别用0,1来代替。根据P可以轻易知道‘)’的位置:location = p[i] + i。用value记录w[i]的值,用flag记录括号是否成对。
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 int t,n;
5 int s[41],p[21],w[21];
6 int main()
7 {
8 scanf("%d",&t);
9 while(t--){
10 scanf("%d",&n);
11 int temp,flag,value;
12 memset(s,0,sizeof(s));
13 for(int i = 0;i < n;++i){
14 scanf("%d",&p[i]);
15 temp = p[i] + i;
16 s[temp] = 1;
17 for(int k = temp-1,value = 1,flag = 0;k >= 0;--k){
18 if(s[k] == 0 && flag == 0){
19 w[i] = value;
20 break;
21 }
22 else if(s[k] == 1){
23 value++;
24 flag++;
25 }
26 else if(s[k] == 0)flag--;
27 }
28 }
29 for(int i = 0;i < n;++i)printf("%d ",w[i]);
30 printf("\n");
31 }
32 system("pause");
33 return 0;
34 }
35
code