POJ 1068 Parencodings

来源:互联网 发布:菜鸟网络待遇 编辑:程序博客网 时间:2024/06/06 02:05

POJ 1068 Parencodings


#include<cstdio>#include<cstring>using namespace std;const int maxn = 41;int lr[maxn],rl[maxn],r[maxn],ans[maxn];//记录每个括号左侧的右括号数,右侧的左括号数,右括号的位置int main(){int cas,n,num,cnt;scanf("%d",&cas);while(cas--){cnt = 1;scanf("%d",&n);for(int i = 1;i<=n;i++){scanf("%d",&num);for(int j = cnt;j<=i+num;j++){lr[j] = i-1;rl[j] = j==i+num?n-j+i:n-1-j+i;}r[i] = i+num;cnt = i+num+1;}for(int i = 1;i<=n;i++){int reg = -1; //记录与第i个右括号匹配的左括号位置for(int j = r[i]-1;j>0;j--){if((rl[j]-rl[r[i]])==(lr[r[i]]-lr[j])){ //找到与每个右括号匹配的左括号reg = j;break;}}ans[i] = lr[r[i]] - lr[reg] + 1;}for(int i = 1;i<n;i++)printf("%d ",ans[i]);printf("%d\n",ans[n]);}}