Codeforces Round #761 A. Forbidden Subsequence

题目大意

 

给定一个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;
        }
    }
}

 

posted @ 2021-12-17 08:37  前排吃瓜  阅读(58)  评论(0编辑  收藏  举报