Bootstrap

2023.12.5 codeforces Div.3 B.YetnotherrokenKeoard

首先讲述一下这道题的题意:

1.录入一段字符。

2.如果录入的是字符b,则删除该字符前面离该字符最近的小写字母,如果没有,则忽视。

3.如果录入的是字符B,则删除该字符前面离该字符最近的大写字母,如果没有,则忽视。

4.最后将剩下的字符打印出来,否则打印空行。


其次讲述一下我个人的做题思路:

1.首先肯定是创建一个字符数组arr来录取字符串。

2.之后便是遍历arr的每一个字符。

3.此时我创建了两个数组,brr,crr用于分别记录在arr中小写字母和大写字母的下标,并用flag1与flag2来记录数组的大小。

4.此时遍历有三种情况:

第一种:遍历到非B与b的其他字母,则将其下标记录到brr与crr中,并让flag自增。

第二种:遍历到b,此时,我用字符','来标记arr中b与B的位置以及被删除的字符的位置。如果flag1大于等于0,就让此时arr[brr[flag1]]等于',',并让flag1自减。

第三种:遍历到B,与二同理,代码如下:

5.最后就是把arr遍历跳过字符 ',' 输出。

6.提醒:别忘了换行哦。


下面是完整代码:


#include <iostream>
#include <algorithm>
using namespace std;
char arr[1000001] = { 0 };
int brr[1000001] = { 0 };
int crr[1000001] = { 0 };
int main() {
	int t;
	cin >> t;
	while (t--) {
		int flag1 = -1;
		int flag2 = -1;
		scanf("%s", &arr);
		int l = strlen(arr);
		
		for (int i = 0; i < l; i++) {
			if (arr[i] == 'b') {
				arr[i] = ',';
				if (flag1 >= 0) arr[brr[flag1--]] = ',';
			}
			else if (arr[i] == 'B') {
				arr[i] = ',';
				if (flag2 >= 0) arr[crr[flag2--]] = ',';
			}
			else if (arr[i] >= 'a' && arr[i] <= 'z')brr[++flag1] = i;
			else if (arr[i] >= 'A' && arr[i] <= 'Z')crr[++flag2] = i;

		}
		for (int i = 0; i < l; i++) {
			if (arr[i] != ',')printf("%c", arr[i]);
		}
		printf("\n");
	}
	return 0;
}

大一蒟蒻第一次写博客,大神勿喷。
;