AoiJays's Space.

CF1886C. Decreasing String

2023/12/25

链接)

题意

给定字符串$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';
}
CATALOG
  1. 1. 题意
  2. 2. 题解