HBU省赛选拔——7-7 加密信息---hard version

该博客探讨了一种加密字符串的解密方法,包括翻转字符串、删除重复字符等步骤。通过给出的示例代码,展示了如何使用C++的deque容器实现解密过程。在解密过程中,如果遇到字符'R',则翻转当前解密字符串;否则,将字符添加到字符串中。解密完成后,删除所有连续重复的字符,得到最终解密字符串。
摘要由CSDN通过智能技术生成

给定一个长度为n(n<=5×10​5)的加密字符串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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值