A. Another String Minimization Problem

Problem - A - Codeforces

您有一个序列一个1,一个2,...,一个na1,a2,...,an长度n,由介于1m.您还有一个字符串s,包括m个字符 B。

您将执行以下操作n个操作。

  • i-th (1≤i≤n) 操作,则将一个ai-th (m+1−ai)-第 个字符s换成 A.您可以通过这些操作多次替换任何位置的字符。

查找在这些操作后可以获得的词典上最小的字符串。

字符串x在字典上比字符串小y当且仅当在第一个位置时,长度相同,其中xy不同,字符串x有一个字母在字母表中出现的时间早于y.

输入

第一行包含测试用例的数量tt (2000≤1≤吨2000≤1≤吨).

每个测试用例的第一行包含两个整数nnmm (1≤,米≤501≤,米≤50) — 序列的长度一个一个和字符串的长度ss分别。

第二行包含nn整数一个1,一个2,...,一个na1,a2,...,an (1≤一个我≤米1≤ai≤m) — 序列一个一个.

输出

对于每个测试用例,打印一个长度字符串m— 你能得到的词典上最小的字符串。字符串的每个字符都应为大写英文字母 A 或大写英文字母 B。

输入
复制
6
4 5
1 1 3 1
1 5
2
4 1
1 1 1 1
2 4
1 3
2 7
7 5
4 5
5 5 3 5
输出
复制
ABABA
BABBB
A
AABB
ABABBBB
ABABA
注意

在第一个测试用例中,序列a=[1,1,3,1]a=[1,1,3,1].其中一种可能的解决方案如下。

  • 1-th 操作,可以更换11-st 字符ss与 A.之后,ss成为BBBB
  • 2-th操作,可以更换55-第 个字符ss与 A(因为m+1−一个2=5m+1−a2=5).之后,ss成为 ABBBA
  • 3-th操作,可以更换33-rd 字符ss与 A.之后,ss成为 ABABA。
  • 4-th 操作,可以更换11-st 字符ss与 A.之后,ss仍然等于 ABABA。
生成的字符串为 ABABA。不可能生成字典上较小的字符串。

在第二个测试用例中,您将只执行一个操作。您可以将22-nd 字符或44-第 个字符ss与 A.您可以在操作后获取字符串 BABBB 和 BBBAB。字符串 BABBB 是这些字符串中在词典上最小的。

在第三个测试用例中,唯一可以获得的字符串是 A。

在第四个测试用例中,您可以替换1-st 和2-st 字符ss用 A 获得 AABB。

在第五个测试用例中,您可以替换1-st 和3-st 字符ss用A得到ABABBBB。

 题意就是说:有一串长度为m,元素全是B的字符串,有n个操作,使B变成A,要么ai变成A或者m+1-ai变A,并且尽可能要使A更靠前,这样字典序更小。只要比较ai和m+1-ai的大小就行。

#include<iostream>
using namespace std;
char b[110];
int t,n,m,x;
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        fill(b+1,b+m+1,'B');//填充函数
       while(n--)
      {
         cin>>x;
         if(x<m+1-x)
         {
            if(b[x]!='A')//如果这个位置已经有了,那就只能选择另一个了
                b[x]='A';
            else b[m+1-x]='A';
         }
         else
         {
             if(b[m+1-x]!='A')
                b[m+1-x]='A';
             else b[x]='A';
         }

      }
      for(int i=1;i<=m;i++)cout<<b[i];
      cout<<endl;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值