2 条题解
-
2
可以发现输入过程相当于把字母存入栈内,删除操作相当于弹出栈顶元素,可以分别用栈记录大写和小写字母的输入,读到删除操作弹出栈顶元素即可。
#include<bits/stdc++.h> using namespace std; char s[1000005]; char s1[1000005]; int main() { int t; cin >> t; while(t--) { stack<int>o,p;//分别记录大小写 scanf("%s",s); int l1=strlen(s); int num=0; for(int i=0;i<l1;i++) { if(s[i]=='b')//读到删除操作 { if(o.size())//操作之前要判断栈是否为空,否则会运行错误(RE) { s[o.top()]='0';//删除字母打上标记 o.pop(); } } else if(s[i]=='B')//同上 { if(p.size()) { s[p.top()]='0'; p.pop(); } } else if(s[i]>='a'&&s[i]<='z')//压入栈 { o.push(i); } else { p.push(i); } } for(int i=0;i<l1;i++)//输出 { if(s[i]!='0'&&s[i]!='B'&&s[i]!='b')cout <<s[i]; } cout <<'\n'; } }
-
2
一道比较简单的模拟题,从后往前进行遍历,当遇到删除字符 和 时,记录下来,当遇到其他字符时根据记录情况进行删除。
#include <stdio.h> #include <iostream> #include <string.h> using namespace std; const int N = 1e6 + 9; char ai[N]; int main() { int t, sum1, sum2; scanf("%d", &t); while(t --) { sum1 = 0; sum2 = 0; scanf("%s", ai); int len = strlen(ai); for(int i = len - 1; i >= 0; i --) { if(ai[i] == 'b') sum1 ++; if(ai[i] == 'B') sum2 ++; if(sum1 > 0 && ai[i] >= 'a' && ai[i] <= 'z' && ai[i] != 'b') { ai[i] = '0'; sum1 --; } if(sum2 > 0 && ai[i] >= 'A' && ai[i] <= 'Z' && ai[i] != 'B') { ai[i] = '0'; sum2 --; } } for(int i = 0; i < len; i ++) { if(ai[i] != '0' && ai[i] != 'b' && ai[i] != 'B') { printf("%c", ai[i]); } } printf("\n"); } return 0; }
- 1
信息
- ID
- 1017
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 61
- 已通过
- 18
- 上传者