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