链接)
题意
给定字符串$s_1$
每次从中删除一个字符,使得剩下的字符串字典序最大
得到$s_2,s_3,…$
最后得到的字符串组合起来:$s_1+s_2+…$
求第$x$位的字符
题解
删除字符的结论:第一个下降的转折点
abcded
若整个字符串不减,则删除最后一个字符
所以我们可以使用单调栈维护出每个字符再第几轮被删掉
$x = n + n-1 + n-2 + …$
所以我们不断减去$n-i$,就可以得到$x$处于子字符串$s_j$中
那么被删除轮次小于$j$的字符全部忽略
剩下的字符中找到目标答案即可
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
| inline char solve() {
string str; cin >> str; long long pos; cin >> pos;
int tot = 0; vector<int > del_cnt(str.length() + 1); vector<int > st;
for (int i=0;i<str.length();++i) { while ( st.size() && str[i] < str[ *st.rbegin() ] ) { del_cnt[ *st.rbegin() ] = ++tot; st.pop_back(); } st.emplace_back(i); }
for (int j=(int)st.size() - 1;j>=0;--j) del_cnt[ st[j] ] = ++tot;
int len = str.length(), turn = 1; while ( pos > len ) pos -= len --, ++turn;
for (int i=0;i<str.length();++i) if ( del_cnt[i] < turn ) str[i] = '_'; for (int i=0;i<str.length();++i) if (str[i]!='_') { --pos; if(!pos) return str[i]; }
return '\000'; }
|