链接:[ABC328D] Take ABC - 洛谷 | 计算机科学教育新生态
题目描述
A
, B
, C
の 33 種類の文字のみからなる文字列 SS が与えられます。
SS が連続な部分文字列として文字列 ABC
を含む限り、下記の操作を繰り返します。
SS に連続な部分文字列として含まれる文字列
ABC
のうち、SS の中で最も左にあるものを、SS から削除する。
上記の手順を行った後の、最終的な SS を出力してください。
输入格式
入力は以下の形式で標準入力から与えられる。
SS
输出格式
答えを出力せよ。
题意翻译
题目描述
给你一个由 A
,B
,C
组成的字符串 SS,只要 SS 包含子串 ABC
,那么重复以下操作:
从 SS 中删除最左边出现的子串
ABC
。
执行上述操作后,输出最终字符串 SS 。
输入输出样例
输入 #1复制
BAABCBCCABCAC
输出 #1复制
BCAC
输入 #2复制
ABCABC
输出 #2复制
输入 #3复制
AAABCABCABCAABCABCBBBAABCBCCCAAABCBCBCC
输出 #3复制
AAABBBCCC
说明/提示
制約
- SS は
A
,B
,C
のみからなる長さ 11 以上 2× 1052× 105 以下の文字列
Sample Explanation 1
与えられた文字列 S =S = BAABCBCCABCAC
に対して、下記の通りに操作が行われます。 - 11 回目の操作で、S =S = BAABCBCCABCAC
の 33 文字目から 55 文字目の ABC
が削除され、その結果 S =S = BABCCABCAC
となります。 - 22 回目の操作で、S =S = BABCCABCAC
の 22 文字目から 44 文字目の ABC
が削除され、その結果 S =S = BCABCAC
となります。 - 33 回目の操作で、S =S = BCABCAC
の 33 文字目から 55 文字目の ABC
が削除され、その結果 S =S = BCAC
となります。 よって、最終的な SS は BCAC
です。
Sample Explanation 2
この入力例では、最終的な SS は空文字列です。
C++代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
stack<char> stk;
for(int i=0;i<(int)s.size();i++){
char c=s[i];
if(c=='C'){
if(stk.size()>=2){
char b=stk.top();
stk.pop();
char a=stk.top();
stk.pop();
if(b!='B'||a!='A'){
stk.push(a);
stk.push(b);
stk.push(c);
}
}else{
stk.push(c);
}
}else{
stk.push(c);
}
}
string ans="";
while (stk.size()){
ans+=stk.top();
stk.pop();
}
reverse(ans.begin(),ans.end());
cout<<ans;
}