【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 }