天天看點

字元串最小字典序子序列

#include<bits/stdc++.h>
using namespace std;
char a[10080];
vector<int>pos[26];
int main()
{
    int n,m;
    char ans[10080];
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<=26;i++)pos[i].clear();
        scanf("%d",&m);
        scanf("%s",a);
        for(int i=0; i<n; i++) pos[a[i]-'a'].push_back(i+1);
        memset(ans,0,sizeof ans);
        int tmp=0;
        for(int i=0; i<m; i++)
        {
            for(int j=0; j<26; j++)
            {
                if(pos[j].size()!=0)
                {
                    int num=pos[j][upper_bound(pos[j].begin(),pos[j].end(),tmp)-pos[j].begin()];
                    if(num>tmp&&num<=n-m+i+1)
                    {
                        tmp=num;
                        ans[i]='a'+j;
                        break;
                    }
                }
            }
        }
        printf("%s\n",ans);
    }
}