Loading

CF1428C

Description

有一个只包含'A'与'B'的字符串,每次可以消掉一个 “AB” 或一个 “BB”,并把剩下的拼在一起,求字符串最短的长度。


题意已经够简洁了;

这是今天校内魔泥赛唯一一道水题。


Solution

1.

可以用栈维护元素。

这里推荐用 STL 里的 stack,可能有点慢,但是好用也不会超时;

手写栈清空时直接把头指针归零就好了,memset 遇到大数据会被卡。

2.

如果用贪心做此题,要注意修改的优先性。

一定是先消除所有的 “AB”,再消除剩下的 “BB”。

正确性证明:

如果优先消除 “BB”,可能会出现剩余的 “A” 无法被消除的情况。

比如 “AAAABBBB”,正确的做法是每一个 “A” 与“B”组队消除,剩下的依次拼接消除,答案是 0;

如果优先消除了 “BB” 或者遇到哪一对消除哪一对,可能会有 “A” 剩余,剩下 “AAAA” 或者 “AA” 的情况,而这并不是最短的。


我用的 STL 维护栈毕竟好写

Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>

using namespace std;

int t;
string a;
stack<int> st;

int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0' ||ch>'9'){
		if(ch=='-') w=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
	return s*w;
}

int main(){
	t=read();
	for(int i=0;i<t;i++){
		cin>>a;
		int tot=a.length();
	    st.push(a[0]);
	    for(int j=1;j<tot;j++){
            if(st.size()){
	    	    if(a[j]=='B' &&((char)st.top()=='A'||(char)st.top()=='B')){
	    		    st.pop();
	    	    	continue;
			    }
			}
			st.push(a[j]);
		}
		printf("%d\n",st.size());
		while(st.size()) st.pop();
	}
	return 0;
}

posted @ 2020-11-06 09:40  KnightL  阅读(73)  评论(0编辑  收藏  举报