Codeforces Round #761 A. Forbidden Subsequence
阿新 • • 發佈:2021-12-17
題目大意
給定一個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;
}
}
}