• Codeforce940C (Phone Numbers)


    C. Phone Numbers
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    And where the are the phone numbers?

    You are given a string s consisting of lowercase English letters and an integer k. Find the lexicographically smallest string t of length k, such that its set of letters is a subset of the set of letters of s and s is lexicographically smaller than t.

    It's guaranteed that the answer exists.

    Note that the set of letters is a set, not a multiset. For example, the set of letters of abadaba is {a, b, d}.

    String p is lexicographically smaller than string q, if p is a prefix of q, is not equal to q or there exists i, such that pi < qi and for all j < i it is satisfied that pj = qj. For example, abc is lexicographically smaller than abcd , abd is lexicographically smaller than abec, afa is not lexicographically smaller than ab and a is not lexicographically smaller than a.

    Input

    The first line of input contains two space separated integers n and k (1 ≤ n, k ≤ 100 000) — the length of s and the required length of t.

    The second line of input contains the string s consisting of n lowercase English letters.

    Output

    Output the string t conforming to the requirements above.

    It's guaranteed that the answer exists.

    Examples
    Input
    Copy
    3 3
    abc
    Output
    aca
    Input
    Copy
    3 2
    abc
    Output
    ac
    Input
    Copy
    3 3
    ayy
    Output
    yaa
    Input
    Copy
    2 3
    ba
    Output
    baa
    Note

    In the first example the list of strings t of length 3, such that the set of letters of t is a subset of letters of s is as follows: aaa, aab, aac,

    aba, abb, abc, aca, acb, .... Among them, those are lexicographically greater than abc: aca, acb, .... Out of those the lexicographically smallest is aca.

    分析:题意是找出按字典序的下一个长度为k的字符串。

    当n<k时,在原字符串加上字典序最小的字符即可;

    当n>=k时,贪心,从k-1到0找到不是最大字符的一位j,然后s[j]赋值为按字典序的下一个字符,

    j以后的全部为赋值为字典序最小的字符。

    #include<cstdio>
    #include<cstring>
    using namespace std;
    char s[200000];
    int b[30];
    char a[30];
    int main()
    {
        int N,k;
        scanf("%d%d",&N,&k);
        scanf("%s",s);
        for(int i=0;i<N;i++)
        b[s[i]-'a']++;
        
        int cnt=0;
        for(int i=0;i<26;i++)
        if(b[i]) a[cnt++]='a'+i;
        cnt--;
        if(k>N)
        {
            s[k]='';
            for(int i=N;i<k;i++) s[i]=a[0];
            printf("%s
    ",s);
        }
        else//找出那个位置 
        {
            s[k]='';
            for(int i=k-1;i>=0;i--)
            {
                if(s[i]==a[cnt]) {s[i]=a[0];continue;}
                else
                {
                    int j=0;
                    for(;j<=cnt;j++)
                    {
                        if(s[i]<a[j]) break;
                    }
                    s[i]=a[j];
                    break;
                }
            }
            printf("%s
    ",s);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Angular笔记
    Angular数据双向绑定机制
    块级元素垂直居中
    Linux文件系统硬/软连接
    Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)
    Js获取当前日期时间及其它操作
    escape()、encodeURI()、encodeURIComponent()区别详解
    for (var i in obj/array){}
    setInterval中传递参数
    PHOTOSHOP常用快捷键大全
  • 原文地址:https://www.cnblogs.com/ACRykl/p/8473918.html
Copyright © 2020-2023  润新知