坐标平面上有一个机器人。最初,机器人位于点 ( 0 , 0 ) (0, 0) (0,0) 。它的路径被描述为长度为 n n n 的字符串 s s s ,由字符 “L”、“R”、“U”、"D "组成。
每个字符都对应着某个移动:
- L"(左):表示机器人从点 ( x , y ) (x, y) (x,y) 移动到点 ( x − 1 , y ) (x - 1, y) (x−1,y) ;
- R’(右):表示机器人从点 ( x , y ) (x, y) (x,y) 移动到点 ( x + 1 , y ) (x + 1, y) (x+1,y) ;
- U"(向上):表示机器人从点 ( x , y ) (x, y) (x,y) 移动到点 ( x , y + 1 ) (x, y + 1) (x,y+1) ;
- D"(向下):表示机器人从点 ( x , y ) (x, y) (x,y) 移动到点 ( x , y − 1 ) (x, y - 1) (x,y−1) 。
创建该机器人的公司要求您以某种方式优化机器人的路径。为此,您可以删除路径中的个非空子串。但这家公司不希望他们的客户注意到机器人行为的变化。这意味着,如果在优化之前,机器人的路径终点是 ( x e , y e ) (x_e, y_e) (xe,ye) ,那么在优化之后(即删除 s s s 中的某个子串),机器人的路径终点也是 ( x e , y e ) (x_e, y_e) (xe,ye) 。
这个优化是一个低预算项目,因此您需要删除可能的最短非空***子串,以优化机器人的路径,使其路径的终点不变。你有可能无法优化路径。此外,优化后的目标路径也有可能是空字符串(即删除的子串是整个字符串 s s s )。
回想一下, s s s 的子串就是从 s s s 中删除一定量的前缀字符(可能为零)和后缀字符(可能为零)后得到的字符串。例如,"LURLLR "的子串有 “LU”、“LR”、“LURLLR”、“URL”,但没有 "RR "和 “UL”。
您必须回答 t t t 个独立的测试用例。
输入
输入的第一行包含一个整数 t t t ( 1 ≤ t ≤ 1000 1 \le t \le 1000 1≤t≤1000 ) - 测试用例的数量。
接下来的 2 t 2t 2t 行描述测试用例。每个测试用例都有两行。测试用例的第一行包含一个整数 n n n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 1 \le n \le 2 \cdot 10^5 1≤n≤2⋅105 ) - 机器人路径的长度。测试用例的第二行包含一个字符串 s s s ,由 n n n 个字符 “L”、“R”、“U”、"D "组成,即机器人的路径。
保证所有测试用例中 n n n 的总和不超过 2 ⋅ 1 0 5 2 \cdot 10^5 2⋅105 ( ∑ n ≤ 2 ⋅ 1 0 5 \sum n \le 2 \cdot 10^5 ∑n≤2⋅105 )。
输出
对于每个测试案例,都要打印上面的答案。如果无法删除机器人路径端点不变的非空子串,则打印-1。否则,打印两个整数 l l l 和 r r r ,即 1 ≤ l ≤ r ≤ n 1 \le l \le r \le n 1≤l≤r≤n --您删除的子串的端点。 r − l + 1 r-l+1 r−l+1 应该是最小值。如果有多个答案,请打印其中任意一个。
这题同样给出了一个新奇且重要的思想,我们不必计算向左右或者上下移动的次数是否相同,可以直接记录坐标,如果当前更新的坐标是之前出现过的,就直接取到之前的坐标为启始,当前坐标为末尾,直接删掉中间的这一段串就可以。
#include<iostream>
#include<map>
using namespace std;
#define pii pair<int,int>
void solve(){
map<pii,int>vis;
int n;cin >> n;
int x = 0,y = 0;
int st = 0,ed = 1e9;
vis[{0,0}] = 0;
for(int i = 1;i <= n;i++){
char c;cin >> c;
x = x - (c == 'L') + (c == 'R');
y = y + (c == 'U') - (c == 'D');
//这里一定要用count,如果直接判断vis[{x,y}]是否为不为0的数会出错,map初始数据不确定
if(vis.count({x,y}) && i - vis[{x,y}] < ed - st){
st = vis[{x,y}] + 1,ed = i;
}
vis[{x,y}] = i;
}
if(ed == 1e9)cout << -1 << endl;
else cout << st << " " << ed << endl;
return;
}
int main(){
int t;cin >> t;
while(t--){
solve();
}
return 0;
}