比较简单,建议评橙。
题面。
思路
对于每个给定的字符串,用两个大根堆来分别记录小写字母与大写字母,注意这里记录时不要记录大写的 B
和小写的 b
。
每当出现一个 B
时,从记录大写字母的大根堆中取出目前最后录入的大写字母的位置,标记,接着弹出堆顶元素,标记。小写字母同理。
以上操作在遍历一遍字符串的情况下可以实现。
最后再遍历一遍字符串,输出未打标记的字符即可。大写的 B
和小写的 b
不要输出。
代码
记得多测清空!!!!!!
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#define ll long long
#define fr(i , a , b) for(ll i = a ; i <= b ; ++i)
#define fo(i , a , b) for(ll i = a ; i >= b ; --i)
using namespace std;
priority_queue <ll> qx;
priority_queue <ll> qd;
//priority_queue <ll , vector<ll> , greater<ll>> q;
ll T;
char s[1000006];
signed main()
{
// freopen("in.in" , "r" , stdin);
// freopen("out.out" , "w" , stdout);
scanf("%lld" , &T);
while(T--)
{
while(!qx.empty())
{
qx.pop();
}
while(!qd.empty())
{
qd.pop();
}
scanf("%s" , s + 1);
ll len = strlen(s + 1);
fr(i , 1 , len)
{
qx.push(-i);
qd.push(-i);
if(s[i] >= 'a' && s[i] <= 'z' && s[i] != 'b')
{
qx.push(i);
}
else if(s[i] >= 'A' && s[i] <= 'Z' && s[i] != 'B')
{
qd.push(i);
}
if(s[i] == 'b')
{
ll del = qx.top();
qx.pop();
if(del >= 0)
{
s[del] = '!';
}
s[i] = '!';
}
if(s[i] == 'B')
{
ll del = qd.top();
qd.pop();
if(del >= 0)
{
s[del] = '!';
}
s[i] = '!';
}
}
fr(i , 1 , len)
{
if(s[i] == '!')
{
continue;
}
cout << s[i];
}
cout << '\n';
}
return 0;
}
标签:fr,题解,ll,YetnotherrokenKeoard,CF1907B,del,qd,qx,include
From: https://www.cnblogs.com/xhqdmmz/p/18126529