POJ 1068——Parencodings
阿新 • • 發佈:2018-12-26
題目連結:http://poj.org/problem?id=1068
題目理解了半天,題目大意:給定一個P序列,求W序列,Pi表示第i個右括號前的所有左括號的數量,Wi表示第i個右括號直到與其匹配的左括號之間的左括號的數量(包括與其匹配的左括號),我的解題方法是模擬,先通過P序列求出括號排列方式,再求出W序列,例題解釋:
P:456666
第一個右括號之前有4個左括號:(((()
第二個右括號之前有5個左括號,不必從頭判斷,5-4=1就是第一個右括號和第二個右括號之前的左括號的數量:(((()()
第三個右括號與第二個右括號之間有6-5=1個,(((()()()
第四個右括號與第三個右括號之間有6-6=0個,(((()()())
第五個右括號與第四個右括號之間有6-6=0個,(((()()()))
第六個右括號與第五個右括號之間有6-6=0個,(((()()())))
W:111456
程式碼:
#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char a[400]; char w[200]; char p[200]; int i; int j; int k; int l; int m; int n; int nn; int t; int count; scanf("%d",&t); while(t--){ scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&w[i]); } nn=0; i=0; l=0; k=0; while(nn<n){ for(j=0;j<w[nn]-l;j++){ a[i++]='('; } a[i]=')'; for(j=i-1,count=0,m=0;i>=0;j--){ if(a[j]==')'){ m++; } else if(a[j]=='('&&m==0){ p[k++]=count+1; break; } else if(a[j]=='('){ m--; count++; } } i++; l=w[nn++]; } /*nn=0; while(nn<i){ printf("%c ",a[nn++]); } printf("\n");*/ for(i=0;i<n;i++){ printf("%d ",p[i]); } printf("\n"); } return 0; }