您有一个序列一个1,一个2,...,一个na1,a2,...,an长度n,由介于1和m.您还有一个字符串s,包括m个字符 B。
您将执行以下操作n个操作。
- 在i-th (1≤i≤n) 操作,则将一个ai-th 或(m+1−ai)-第 个字符s换成 A.您可以通过这些操作多次替换任何位置的字符。
查找在这些操作后可以获得的词典上最小的字符串。
字符串x在字典上比字符串小y当且仅当在第一个位置时,长度相同,其中x和y不同,字符串x有一个字母在字母表中出现的时间早于y.
第一行包含测试用例的数量tt (2000≤1≤吨2000≤1≤吨).
每个测试用例的第一行包含两个整数nn和mm (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。
在第二个测试用例中,您将只执行一个操作。您可以将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;
}
}