zoj 1016 Parencodings

/* zoj 的第100道题 Oh yeah! 本来想用模拟结果发现细节超多 然后就在网上看到了这个方法 很巧妙 具体思想是这样的 由于括号序列是完全匹配的 所以有多少右括号就有多少左括号 P序列输入的是每一个右括号前左括号的个数 要求的是从与他匹配的左括号开始到他自身的右括号的个数 所以可以设一个左括号序列用右括号跟他匹配 对于每一个P 他的左边肯定有p个左括号 跟他匹配的就是从第p个开始的往前数第一个未被匹配的左括号 找到后标记一下 而从这个左括号开始到p的右括号的个数正好就是他们之间已经匹配的括号对数+1 具体做法如下 用一个数组left[]记录左括号的匹配情况 初始化为零表示都没有匹配 然后读入一个p就从left[p]开始查找第一个left[j]==0 然后p-j+1就是从与他匹配的左括号到他自身的右括号的个数 最后把left[j]赋值为1表示已经匹配成功 */ #define LOCAL #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<iomanip> #include<string> #include<algorithm> #include<ctime> #include<stack> #include<queue> #include<vector> #define N 10005 using namespace std; int main() { #ifdef LOCAL freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int left[25],i,first,ncase,len,t; cin>>ncase; while(ncase--) { memset(left,0,sizeof(left)); first=1; cin>>len; while(len--) { cin>>t;i=t; while(left[i]) i--; if(first){cout<<t-i+1;first=0;} else cout<<" "<<t-i+1; left[i]=1; } cout<<endl; } return 0; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值