1 条题解
-
0
文字教学
这道题的核心是枚举第一个不同位置+对称扩展,避免暴力比较所有子串。
- 关键观察:反转子串
[i,j]后,新数与原数的大小仅由子串[i,j]反转后的部分决定。我们需要找到第一个位置l(在[i,j]内),使得反转后的字符与原字符不同,且反转后的字符更小。 - 枚举位置对:枚举所有
l < r且s[l] > s[r]的位置对,此时子串[l,r]反转后一定更小。 - 对称扩展:从
[l,r]向左右扩展,只要左右对称位置的字符相等,扩展后的子串[i,j]反转后第一个不同位置仍是l,因此也合法。
代码
#include <bits/stdc++.h> using namespace std; char s[5005]; int main() { cin >> s; int n = strlen(s); long long ans = 0; for (int l = 0; l < n; ++l) { for (int r = l + 1; r < n; ++r) { if (s[l] > s[r]) { ans++; int i = l - 1; int j = r + 1; while (i >= 0 && j < n && s[i] == s[j]) { ans++; i--; j++; } } } } cout << ans << endl; return 0; } - 关键观察:反转子串
- 1
信息
- ID
- 8596
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者
京公网安备 11011102002149号