问题:ParencodingsPOJ - 1068
序列如4 5 6 6 6 6表示第i个")"前面有几个"(",求序列如1 1 1 4 5 6,即与第i个")"相匹配的"("是其前面的第几个"("
分析:
模拟法,模拟写括号,匹配括号的过程即可得到答案
匹配过程:先读一个数num,然后把对应的"("都写上,相当于吧left[]填1填到num为止;然后开始从填的最后一位开始往前找1,找到1的同时记录往前走了几步,并把找到的1改为0,记录的步数作为答案保存起来,进入下一个数的输入,以此类推;但是要注于每一步的衔接,用now记录已经填到第几步,防止每次都从第一个开始填,用k取出开始找1的下标,不断k--直到找到1,同时利用counter记步数;特别注意代码里面的初始化是在哪里做的,这也是很重要的
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<bitset>
#include<list>
#define ll long long
#define INF 0x3f3f3f3f
#define EXP 1e-10
#define lowbit(x) (x&-x)
using namespace std;
int Left[50],ans[50];
int main(){
int n,m;
cin>>n;
while(n--){
memset(Left,0,sizeof(Left));
memset(ans,0,sizeof(ans));
cin>>m;
int num;
int now=1;
for(int i=1;i<=m;i++){
cin>>num;
for(;now<=num;now++){
Left[now]=1;
}
int counter=1,k=now-1;
//cout<<"i: "<<i<<endl;
//cout<<"k:"<<k<<" counter:"<<counter<<endl;
while(Left[k]==0){
k--;counter++;
}
/*cout<<"k:"<<k<<" counter:"<<counter<<' ';
cout<<"Left: ";
for(int i=1;i<=num;i++){
cout<<Left[i]<<' ';
}
cout<<"ans: ";
for(int i=1;i<=num;i++){
cout<<ans[i]<<' ';
}
cout<<endl;*/
Left[k]=0;
ans[i]=counter;
}
for(int i=1;i<=m;i++){
cout<<ans[i]<<' ';
}
cout<<endl;
}
return 0;
}