H 数字游戏
给你一个N位数,从中去掉K个数字,能得到的最大的数是多少?
INPUT
有T测试数据,每组测试数据第一行由N和K2个整数组成(1 ≤ K < N ≤ 500 000),第二行是N位数(非0开头)。
OUTPUT
对每组数据输出去掉K个数字得到的最大数。
SAMPLE TESTS
IN |
OUT |
3 4 2 1924 7 3 1231234 10 4 4177252841 |
94 3234 775841 |
program:
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 500005;
char s[MAXN], a[MAXN];
vector< int > v[10];
int main( void )
{
// freopen( "d.in","r",stdin );
// freopen( "out.txt","w",stdout );
int n, k,t;
scanf("%d",&t);
while(t--)
{
for(int i=0;i<10;i++)
v[i].clear();
scanf( "%d %d", &n, &k );
scanf( "%s", s );
for( int i = n-1; i >= 0; --i )
v[ s[i]-'0' ].push_back( i );
int m = n-k, p = 0;
for( int i = 0; i < m; ++i )
{
//biramo n-k znamenaka
for( int j = 9; j >= 0; --j )
{
while( v[j].size() > 0 && v[j].back() < p )
v[j].pop_back();
if( v[j].size() > 0 && n-v[j].back()-1 >= m-i-1 )
{
p = v[j].back();
break;
}
}
a[i] = s[p];
p++;
}
a[m] = '\0';
puts( a );
}
return 0;
}