题意:
给你一个字符串,让你从中选出一串字符,使得这串字符的sort后字典序最小,选字符的要求是如果上一个选的是i 那么[i+1,i+m]中至少选一个,[1,m]中必须选一个
首先每次 在1,m里面选择最小的选择了以后,起点位置移动到这里,再次找下一个m范围内的最小的,然后最后扫一遍,把没加进去的但是比最大值要小的都加进去,因为比最大值要小的越多越好
#include <bits/stdc++.h>
using namespace std;
char ans[100010];
int vis[100010];
int main()
{
int n,tot=0;
cin>>n;
string s;
cin>>s;
int st=0;
int len=s.length();
char minn='a';
while(st+n-1<len)
{
int k=st;
char maxx='z'+1;
int maxid=0;
while(k<len&&k<st+n)
{
if(maxx>=s[k])
{
maxx=s[k];
maxid=k;
}
k++;
}
ans[tot++]=s[maxid];
vis[maxid]=1;
minn=max(s[maxid],minn);
st=maxid+1;
}
for(int i=0;i<s.length();i++)
if(!vis[i]&&s[i]<minn) ans[tot++]=s[i];
sort(ans,ans+tot);
printf("%s\n",ans );
}