zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
  • 相关阅读:
    Cocos2Dx(3)——动作类备忘
    npm publish发布包时出现403错误no_perms Private mode enable, only admin can publish this module:
    使用node.js定义一个web服务器
    node.js中events模块应用
    session应用:验证用户是否已登录
    简单实现三级导航栏
    promise对象代替回调函解决异步操作
    js一行代码解实现数组去重和排序
    中英文切换导航栏(最简单)
    错误:localhost将您重定向的次数过多
  • 原文地址:https://www.cnblogs.com/KyleDeng/p/15700753.html
Copyright © 2011-2022 走看看