#模拟 我们可以发现,如果一段路径可以省略,那么这段路径走之前和走之后的位置会是一样的。因此我们可以使用 STL 当中的 [[map]] 来记录上一次走到这个位置的时间。因为是要求最短的区间,因此选择最小值就可以了。时间复杂度 $\mathcal O(n\log_2 n)$。 ```cpp #include <iostream> #include <map> using namespace std; const int kMaxN = 2e5 + 5; int t, n, x, y, l, r, mn; map<pair<int, int>, int> f; // 记录最后一次达到的时间 char c; int main() { for (cin >> t; t; t--) { cin >> n; x = y = 0, mn = 1e9; // 清零 f.clear(); // 清空容器 f[{x, y}] = 0; // 初始时在 (0, 0) for (int i = 1; i <= n; i++) { cin >> c; x = x - (c == 'L') + (c == 'R'); // 移动 x y = y + (c == 'U') - (c == 'D'); // 移动 y if (f.count({x, y}) && i - f[{x, y}] < mn) { // 如果已经记录过并且比答案更优 mn = i - f[{x, y}]; // 修改答案 l = f[{x, y}] + 1, r = i; // 记录位置 } f[{x, y}] = i; // 更新 } if (mn == 1e9) { cout << "-1\n"; } else { cout << l << ' ' << r << '\n'; } } return 0; } ```