题目大意
给定一个S序列和一个T序列,T序列只能是abc的排列。现在求字典序最小的S',S'是S的排列且不包含T(此处包含指从S'前往后取,能取满T则为包含)
分析
思路不难,分情况考虑,如果S中不存在a,b,c任何一个字符,直接将S按字典序排序输出。如果T序列是b或者c开头,直接从a开始按字典序输出。
如果是从a开头,先输出所有a,再看第二位,如果第二位是b,则先输出c,反之先输出b,剩下的按字典序输出,打好标记不要输出重复了。
比赛的时候a题挂了
英文字母居然有26个
代码
#include<bits/stdc++.h>
using namespace std;
int t;
int book[100];
int book2[100];
bool cmp(char a,char b)
{
return b>a;
}
int main()
{
cin>>t;
while(t--)
{
memset(book,0,sizeof(book));
memset(book2,0,sizeof(book));
string a,b;
cin>>a;
cin>>b;
int num=a.length();
for(int i=0;i<num;i++)
{
book[a[i]-'a']++;
}//统计是否全部出现
if(book['a'-'a']==0||book['b'-'a']==0||book['c'-'a']==0)
{
sort(a.begin(),a.end(),cmp);
cout<<a<<endl;
continue;
}
if(b[0]=='b'||b[0]=='c')
{
for(int i=0;i<26;i++)
{
if(book[i]==0) continue;//不存在这个字母
int k=book[i];
for(int j=1;j<=k;j++)
{
cout<<char('a'+i);
}
}
cout<<endl;
continue;
}
if(b[0]=='a')//如果a开头
{
int k=book[0];
book2[0]=1;
for(int i=1;i<=k;i++)
{
cout<<char('a');
}//先把a输出
if(b[1]=='b')
{
book2[2]=1;
int p=book[2];
for(int i=1;i<=p;i++)
{
cout<<char('a'+2);
}//先把c输出
}
else if(b[1]=='c')
{
book2[1]=1;
int p=book[1];
for(int i=1;i<=p;i++)
{
cout<<char('a'+1);
}//先把b输出
}
for(int i=0;i<26;i++)
{
if(book[i]==0||book2[i]==1) continue;//不存在这个字母,已经输出过
int q=book[i];
for(int j=1;j<=q;j++)
{
cout<<char('a'+i);
}
}
cout<<endl;
continue;
}
}
}