C. Yet Another Walking Robot
题目链接-Yet Another Walking Robot
题目大意
给你一个由"U",“D”,“L”,“R"组成的字符串,分别对应坐标轴上的"上”,“下”,“左”,"右"移动,问是否可以去掉一个最短连续子串且不影响原来终点;如果可以,输出子串的起始和结束下标,否则输出NO。
解题思路
将L看成-1,R看成1,U看成1,D看成-1,计算位置,每一步结束之后用map存个位置,看停留在相同位置的最少差多少步,然后直接维护更新答案即可,用pair记录位置的横纵坐标
附上代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF=0x3f3f3f;
const int N=2e5+5;
typedef pair<int,int> PII;
char s[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
map<PII,int> mp;
mp.clear();
mp[{0,0}]=1;
int n;
cin>>n;
ll t=0;
int x=0,y=0,minx=n+1,l,r;
bool flag=0;
mp[{0,0}]=1;
for(int i=1;i<=n;i++){
cin>>s[i];
if(s[i]=='L') x--;
if(s[i]=='R') x++;
if(s[i]=='U') y++;
if(s[i]=='D') y--;
if(mp[{x,y}]&&minx>(i-mp[{x,y}]+1)){
minx=i-mp[{x,y}]+1;
l=mp[{x,y}];
r=i;
}
mp[{x,y}]=i+1;
}
if(minx==n+1)
cout<<"-1"<<endl;
else
cout<<l<<" "<<r<<endl;
}
return 0;
}