-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathkss.cpp
63 lines (54 loc) · 1.21 KB
/
kss.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# include <bits/stdc++.h>
# define NR 1005
# define sigma 26
using namespace std;
ifstream f("kss.in");
ofstream g("kss.out");
int I,n,Q;
int NEXT[NR][sigma];
unsigned long long dp[NR], maxx=1e18, K, S;
char s[NR];
void dinamica () {
unsigned long long AUX=0;
for (int i=0; i<sigma; ++i)
NEXT[n+1][i]=0;
for (int i=n; i>=1; --i) {
dp[i]=1 + AUX;
for (int j=0; j<sigma; ++j)
NEXT[i][j]=NEXT[i+1][j];
AUX=AUX - dp[NEXT[i+1][s[i]-'a']] + dp[i];
if (AUX>maxx) AUX=maxx;
NEXT[i][s[i]-'a']=i;
}
}
int main ()
{
f>>Q;
while (Q--) {
f>>n>>K; f.get();
f.getline(s+1, NR);
dinamica ();
S=0;
for (int i=0; i<sigma && S<K; ++i)
S+=dp[NEXT[1][i]];
if (K>S) {
g<<"-1\n";
continue;
}
I=0;
while (1) {
++I;
for (int i=0; i<sigma; ++i) {
if (K <= dp[NEXT[I][i]]) {
I=NEXT[I][i]; g<<s[I]; --K;
break;
} else {
K-=dp[NEXT[I][i]];
}
}
if (K==0) break;
}
g<<"\n";
}
return 0;
}