[解题报告]加密 栈

【Description】
有一个仅含小写字母的字符串,我们把它按如下方法加密:
STEP1:把所有连续的相同字母都用一个字母代替。比如 aaabbbb 被替换为 ab。
STEP2:在随机的位置插入两个相同的小写字母。重复 STEP2 很多次。
下面是一个加密的实例
初始字符串 ssstieerrrliiittz
STEP1 之后 stierlitz
插入 dd stddierlitz
插入 aa stdaadierlitz
插入 ww wwstdaadierlitz
现在我们给定加密后的字符串,求执行 STEP1 之后的字符串是什么。
【Input】
一个字符串,表示加密后的字符串。
【Output】
一个字符串,表示执行 STEP1 之后的字符串。
【Sample Input】
wwstdaadierlitz
【Sample Output】
stierlitz
【Hint】
对于 30%:N<= 1000
对于 70%:N<=100000
对于 100%:N<=1000000

 

(说好的水题呢)首先经过了step1,整个字符串每个字母都不会连续出现,step2后,对于连续一个字母(如abba中的bb n=2)其连续长度n有2种情况

1.n%2==0:这一串都是step2添加的可以全部删去

2.n%2==1:这一串能被2整除的一部分可以删去,余下一个字母

 从字符串中随机删去字符?<s>链表不是可以快速实现吗?</s> <s>(从此本题臭了)</s>,对于本题,链表的实现 有(fei) 点(chang) 复(gui) 杂(chu)

本题正解是栈,每次输入入栈,入栈时完成对字符串的处理

对于字符入栈有2情况:栈顶与这个字符重复:pop栈顶,不push此字符,(当前字符与栈顶字符正好是2个相同的!)

不重复的字符直接入栈

例如abba 对于一个被割断的连续2字符aa,在首的a一定能在若干个字符后找到与其配对的a,并且满足FILO的顺序(这不就是栈吗??!)

 

代码:

 1 #include <cstdio>
 2 #define pname "encryption"
 3 #define commonfio freopen(pname".in","r",stdin); freopen(pname".out","w",stdout);
 4 using namespace std;
 5 char orz[1000005];
 6 int tot=-1;
 7 int main(){
 8     //commonfio
 9     char x;
10     while(1){
11         x=getchar();
12         if(x>='a' && x<='z'){
13             if(tot!=-1 && orz[tot]==x){
14                 tot--;
15             }else{
16                 orz[++tot]=x;
17             }
18         }else break;
19     }
20     orz[tot+1]=0;
21     printf("%s",orz);
22 }

 

转载于:https://www.cnblogs.com/cpera/p/5873886.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值