给定一个长度为n(n<=5×105)的加密字符串S,解密方式如下:
1.初始时字符串T为空.
2.从头遍历S字符串,令i=1,2,3…,n, 若S的第i个字符是R,那么翻转T字符串,否则将该字符加入T串中.
3. 在上述操作结束后,若T串有两个连续的字符相同, 那么就删除这两个字符,直到T串中没有两个相同的连续字符为止.
那么T串就是最终解密完毕的字符串.
输入格式:
输入一个加密字符串S
S
输出格式:
输出最后解密完毕的字符串T
T
输入样例1:
ozRnonnoe
输出样例1:
zone
样例解释:
● 初始时T为空z加入T中
● 将z
加入T中, 此时T是z
●将o加入T中, 此时T是zo
●翻转T,此时T是oz
●将n
加入T中, 此时T是zon
●将o
加入T中, 此时T是zono
●将n
加入T中, 此时T是zonon
●将n
加入T中, 此时T是zononn
●将o
加入T中, 此时T是zononno
●将e
加入T中, 此时T是zonnoe
●把T中的nn
删除,此时T是zonooe
●把T中的oo
删除,此时T是zone
输入样例2:
hellospaceRhellospace
输出样例2:
此时所有字符都被删除
思路
不知道为什么第六题HBU省赛选拔——7-6 加密信息—easy version过了,第七题多了一个删除重复字符,我设的结构体就过不了了。
大佬用的deque过了
大佬代码–用双端队列deque
#include<bits/stdc++.h>
using namespace std;
int main(){
string S;
cin>>S;
deque<char> q;
bool rev=0;
for(char c : S){
if(c=='R') rev^=1;
else if(rev) q.push_front(c);
else q.push_back(c);
}
if(rev) reverse(q.begin(),q.end());
string T;
for(char c : q){
if(T.size()&&T.back()==c) T.pop_back();
else T.push_back(c);
}
cout<<T<<endl;
return 0;
}
我的代码(没过)
#include<bits/stdc++.h>
using namespace std;
struct stu{
char c;
int num;
int flag=1;
}s1[500001];
int flag=1;
int cmp(stu a,stu b){
if(flag==1) return a.num<b.num;
else return a.num>b.num;
}
void fun(int n){
int min1=0,max1=1;
while(min1>=0&&max1>=0&&min1<n&&max1<n){
if(s1[min1].c!=s1[max1].c){
max1++;
min1=max1-1;
}
else if(s1[min1].c==s1[max1].c){
s1[min1].flag=0;
s1[max1].flag=0;
min1--;
max1++;
}
}
}
int main(){
string s;
char ch;
getline(cin,s);
int min1=0,max1=0,j=0;
for(int i=0;i<s.size();i++){
if(s[i]=='R'){
flag=(-1)*flag;
}else{
s1[j].c=s[i];
if(flag==1){
s1[j].num=++max1;
}
else if(flag==-1){
s1[j].num=--min1;
}
j++;
}
}
sort(s1,s1+j,cmp);
fun(j);
for(int i=0;i<j;i++){
if(s1[i].flag) printf("%c",s1[i].c);
}
return 0;
}