原题大意:机器人可以分别向 L R U D 四个方向移动,某一时刻机器人走到一个它以前走过的点,对此进行记录。记录两个时间点。要求输出最短的时间点。
思路:
直接模拟即可
由于数据达到1e5,因此需要使用较大的二维数组
这时候我们用map
map<int,map<int,int> >
来模拟一个较大的数组
注意:map的查询效率为log n
然后我们设置两个变量代表两个时间点,当存在更短的时间间隔时,更新这两个时间点。
code:
#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
char s[200010];
map<int,map<int,int> >m;
int main(){
int t;
scanf("%d",&t);
while(t--){
m.clear();
int len;
cin>>len;
cin>>s;
int x=0,y=0;
int sign = 0;
int ans = 0x7fffffff;
int l = -1,r = -1;
m[0][0] = 1;
for(int i=0;i<len;i++)
{
if(s[i]=='L') x--;
if(s[i]=='R') x++;
if(s[i]=='U') y++;
if(s[i]=='D') y--;
if(m[x][y]==0) ;
else{
sign = 1;
if(ans>(i-m[x][y]+1)){
r = i+1;
l = m[x][y];
// m[x][y] = i+1;
ans = r-l;
}
}
m[x][y]=i+2;
}
if(!sign)
cout<<-1<<endl;
else cout<<l<<" "<<r<<endl;
}
}