题意:在给出的一个字符串中找出字典序最大的子串。
思路:找出字典序最大的话就要求大的尽可能在前面,所以要把所有的最大的枚举出来,然后在这个的后边再找第二大的,这个时候就要用到二分,找到后一个在这个点之后的点。
后面又想了想,不用二分也行,最多跑完整个字符串O(n);
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 10;
int pos[26][maxn];
char s[maxn];
int lens[26];
int main()
{
while( ~ scanf("%s",s))
{
memset(pos,0,sizeof(pos));
memset(lens,0,sizeof(lens));
int len = strlen(s);
for(int i = 0; i < len; i ++)
{
pos[s[i] - 'a'][lens[s[i] - 'a'] ++] = i;
}
string ans;
int temp = -1;
for(int i = 25; i >= 0; i --)
{
if(lens[i] && pos[i][lens[i] - 1] > temp)
{
int k;
if(pos[i][0] > temp)
k = lens[i];
else if(pos[i][lens[i] - 1] < temp)
k = 0;
else
{
int poss = lower_bound(pos[i],pos[i] + lens[i],temp) - pos[i];
k = lens[i] - poss;
}
while(k --)
{
ans += char(i + 'a');
}
if(k)
temp = pos[i][lens[i] - 1];
}
}
cout << ans << endl;
}
return 0;
}