T2 字典之序
解题思路
考虑贪心。
在选每个字母的时候要保证它的后面有所有没有出现过的字母。
每次从后往前找到直到每个未出现过字母都存在,记录下标。
在上一次操作的下标后一位到找到的下标之间取最小的字母。
可以保证这样找到的字符串字典序最小。
code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
string s;
int n;
int a[30];
int v[30],tot;
int main()
{
freopen("aorder.in","r",stdin);
freopen("aorder.out","w",stdout);
cin>>s;
n=s.size();
for(int i=0;i<n;i++)
tot+=(!a[s[i]-'a']?1:0),a[s[i]-'a']=1;
int last=0;
while(tot)
{
memset(v,0,sizeof(v));
int sum=0,i;
for(i=n-1;i>=last&&sum<tot;i--)
sum+=(!v[s[i]-'a']&&a[s[i]-'a']?1:0),v[s[i]-'a']=1;
i++;
int t=100,tt;
for(int j=last;j<=i;j++)
if(a[s[j]-'a']&&s[j]-'a'<t)
t=s[j]-'a',tt=j;
cout<<s[tt];
last=tt+1;
a[t]=0;
tot--;
}
}