本题是一个贪心问题。最重要的就是去找字符串的变换规则。可以看出如果从左向右找的话,如果有某个字符比下一个字符大的话就直接删除即可。
那么还有个问题就是不能简单地采用字符串拼接的方式,因为会超时。
所以在这里找到另一个关键点:题目中只需要某个下标下的值,那么我们就可以在原字符串上进行操作,然后操作后让目标下标剪去该字符串长度。直到我们变换到目标字符串所需要的位置直接找到那个位置就行。这样使用链表去存储方便删除,就可以将时间和空间复杂度降下来。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve() {
string s; cin >> s;
int n = s.length();
list<char> l(s.begin(), s.end());
ll pos; cin >> pos;
list<char>::iterator it = l.begin();
for (int i=n;i>=1;i--) {
if (pos<=i) {
list<char>::iterator it = l.begin();
for (int j=1;j<pos;j++) it++;
cout<<(*it);
return ;
}
int flag = true;
while (it!=(--l.end())) {
list<char>::iterator nxt = it;
nxt++;
if (*it > *nxt) {
l.erase(it);
if (nxt==l.begin()) it=nxt;
else it = --nxt;
flag = false;
break;
}
it++;
}
if (flag) l.erase(it--);
pos -= i;
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int t; cin >> t; while(t--)
solve();
return 0;
}