1. 程式人生 > 其它 >LuoguP7478 【A】StickSuger 題解

LuoguP7478 【A】StickSuger 題解

LuoguP7478 【A】StickSuger 題解

Content

給定一個長度為 \(n\) 的僅包含小寫字母的字串 \(s\),請找到一個二元組 \((i,j)\)\(i<j\))使得在交換字串 \(s\) 的第 \(i\) 個和第 \(j\) 個字元後會使新的字串比原字串的字典序大。若有多個滿足要求的 \((i,j)\),輸出 \(i\) 最大的那一個,如果仍有多個方案,輸出 \(j\) 最大的那一個。

資料範圍:\(1\leqslant n\leqslant 10^6\)

Solution

先從後往前掃,掃到第一個 \(i\in[1,n)\) 使得 \(s_i<s_{i+1}\)(此處為 ASCII 碼比較),記錄下這個位置 \(p\)

。然後判斷是否存在這個位置,如果不存在輸出 -1

否則,再從 \(n\) 開始往後掃到 \(p+1\),掃到第一個 \(i\in[p+1,n]\) 使得 \(s_i>s_p\)(同上)。此時 \((i,p)\) 即為滿足要求的二元組,也就是答案,直接輸出即可。

Code

char s[1000007];

int main() {
	int n = Rint, fl = -1; scanf("%s", s + 1);
	R(int, i, n - 1, 1) if(s[i] < s[i + 1]) {fl = i; break;}
	if(fl == -1) return printf("-1"), 0;
	print_space(fl);
	R(int, i, n, fl + 1) if(s[i] > s[fl]) return write(i), 0;
	return 0;
}