StickSuger
题目背景
YSGHYYDS
题目描述
YSGH 给你一个长度为 n n n 的字符串 S S S。设 S x S_x Sx 表示字符串 S S S 的第 x x x 个字符。你可以选择一个二元组 ( i , j ) (i,j) (i,j),然后交换 S i S_i Si 和 S j S_j Sj。二元组 ( i , j ) (i,j) (i,j) 是合法的当且仅当 1 ≤ i < j ≤ n 1\leq i<j\leq n 1≤i<j≤n 并且交换后的字符串的字典序比原串大。
对于两个字符 c 0 , c 1 c_0,c_1 c0,c1,称 c 0 > c 1 c_0>c_1 c0>c1 当且仅当 c 0 c_0 c0 的 ASCII 码大于 c 1 c_1 c1 的 ASCII 码。
对于两个长度为 n n n 的字符串 S , T S,T S,T, S S S 的字典序大于 T T T 当且仅当存在一个 i ∈ [ 0 , n − 1 ] i\in [0,n-1] i∈[0,n−1] 使得 ∀ j ∈ [ 1 , i ] , S j = T j \forall j\in[1,i],S_j=T_j ∀j∈[1,i],Sj=Tj, 并且 S i + 1 > T i + 1 S_{i+1}>T_{i+1} Si+1>Ti+1。
如果存在多种合法方案,输出最大的二元组。
对于两个二元组 ( i 1 , j 1 ) (i_1,j_1) (i1,j1), ( i 2 , j 2 ) (i_2,j_2) (i2,j2),称 ( i 1 , j 1 ) (i_1,j_1) (i1,j1) 小于 ( i 2 , j 2 ) (i_2,j_2) (i2,j2) 当且仅当 i 1 < i 2 ∨ ( i 1 = i 2 ∧ j 1 < j 2 ) i_1<i_2\lor(i_1=i_2\land j_1<j_2) i1<i2∨(i1=i2∧j1<j2)。
如果不存在合法方案,则输出 -1
。
保证 S S S 只包含小写英文字母。
输入格式
第一行,一个正整数 n n n,表示字符串 S S S 的长度。
第二行,一个字符串 S S S。
输出格式
如果无解,输出 -1
。
否则一行输出两个整数 i , j i,j i,j 表示最大的合法二元组 ( i , j ) (i,j) (i,j)。
样例 #1
样例输入 #1
3
acb
样例输出 #1
1 3
样例 #2
样例输入 #2
6
zyxwvu
样例输出 #2
-1
样例 #3
样例输入 #3
14
aabbccddccbbaa
样例输出 #3
6 8
提示
【样例解释 #1】
如果选择二元组
(
2
,
3
)
(2,3)
(2,3),交换
S
2
S_2
S2 和
S
3
S_3
S3 后的字符串为 abc
,字典序比 acb
小,所以不合法。
如果选择二元组
(
1
,
3
)
(1,3)
(1,3),交换
S
1
S_1
S1 和
S
3
S_3
S3 后的字符串为 bca
,字典序比 acb
大,是合法的。
虽然 ( 1 , 2 ) (1,2) (1,2) 也是合法的,但是没有 ( 1 , 3 ) (1,3) (1,3) 大。所以答案是 ( 1 , 3 ) (1,3) (1,3)。
【样例解释 #2】
容易看出任何一个二元组都不合法。
【数据范围】
本题采用捆绑测试。
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 6 1\leq n\leq 10^6 1≤n≤106, S S S 只包含小写英文字母。
- Subtask 1(4 points): S S S 只包含一种字符。
- Subtask 2(10 points): n ≤ 100 n\leq 100 n≤100。
- Subtask 3(16 points): n ≤ 500 n\leq 500 n≤500。
- Subtask 4(25 points): n ≤ 5000 n\leq 5000 n≤5000。
- Subtask 5(18 points): n ≤ 1 0 5 n\leq 10^5 n≤105。
- Subtask 6(27 points): n ≤ 1 0 6 n\leq 10^6 n≤106。
Scratch实现
后续
接下来我会不断用scratch来实现信奥比赛中的算法题、Scratch考级编程题实现、白名单赛事考题实现,感兴趣的请关注,我后续将继续分享相关内容