栈加双向队列做法
问题陈述
给定一个由小写字母和 , 组成的长度字符串。 尽可能重复以下操作后输出。()
N S S
S
连续的字符子字符串,即第一个字符和最后一个字符,不包含除第一个和最后一个字符以外的任何内容()(1) 可以证明,在尽可能重复操作后,无论操作程序如何,它都是唯一确定的。
这不就是典型栈吗遇见(就入栈遇见)或字符就改变长度判断
code::
#include<bits/stdc++.h>
using namespace std;
string s;
int a[20000005],n;
stack<int> st;
int main(){
scanf("%d",&n);
cin>>s;
for(int i=0;i<n;i++)
if(s[i]=='(')st.push(i);
else if(s[i]==')'&&!st.empty()){
a[st.top()]++;
a[i+1]--;
st.pop();
}
for(int i=0;i<n;i++){
a[i]+=a[i-1];
if(!a[i])putchar(s[i]);
}
return 0;
}
但我们分析这题用双向队列貌似也行于是乎::
code::
// LUOGU_RID: 113372792
#include<cstdio>
#include<deque>
#include<string>
#include<iostream>
using namespace std;
string a;
deque<char>d;
int main(){
int n,i,cnt=0;
scanf("%d",&n);
cin>>a;
for(i=0;i<n;i++){
if(a[i]=='('){
d.push_back('(');
cnt++;
}else if(a[i]==')'){
if(cnt==0){
d.push_back(')');
}else{
cnt--;
while(d.back()!='('){
d.pop_back();
}
d.pop_back();
}
}else{
d.push_back(a[i]);
}
}
while(d.size()){
putchar(d.front());
d.pop_front();
}
return 0;
}
希望管理员能通过^__^