Yet Another Walking Robot
题意:输入一段路径,输出最短的重复段。
思路:每走一步将到达的点存入map,进行判重,并保存最小值;
#include<iostream>
#include<map>
using namespace std;
struct node{
int x,y;
friend bool operator<(node a,node b){
return a.x==b.x?a.y<b.y:a.x<b.x;
}
};
long long minn;
int main(){
int T;
cin>>T;
while(T--){
int n,x=0,y=0,l,ll,r,rr,flag=0;
node e;
map<node,int> ma;
minn=0x3f3f3f3f;
e.x=x;
e.y=y;
ma[e]=-1;
string s;
cin>>n;
flag=0;
cin>>s;
for(int i=1;i<=n;i++){
if(s[i-1]=='L'){//移动
x--;
e.x=x;
e.y=y;
if(ma[e]!=0){
flag=1;
if(ma[e]!=-1){
l=ma[e]+1;
}
else l=1;
r=i;
if(minn>(r-l+1)){
ll=l;
rr=r;
minn=(r-l+1);//更新最小值
}
}
ma[e]=i;//将此时经过的点进行储存。
}
if(s[i-1]=='R'){
x++;
e.x=x;
e.y=y;
if(ma[e]!=0){
flag=1;
if(ma[e]!=-1){
l=ma[e]+1;
}//不是原点,(其实把原点值设为1,其他点值设为i+1更好。。。)
else l=1;
r=i;
if(minn>(r-l+1)){
ll=l;
rr=r;
minn=(r-l+1);
}
}
ma[e]=i;
}
if(s[i-1]=='U'){
y++;
e.x=x;
e.y=y;
if(ma[e]!=0){
flag=1;
if(ma[e]!=-1){
l=ma[e]+1;
}
else l=1;
r=i;
if(minn>(r-l+1)){
ll=l;
rr=r;
minn=(r-l+1);
}
}
ma[e]=i;
}
if(s[i-1]=='D'){
y--;
e.x=x;
e.y=y;
if(ma[e]!=0){
flag=1;
if(ma[e]!=-1){
l=ma[e]+1;
}
else l=1;
r=i;
if(minn>(r-l+1)){
ll=l;
rr=r;
minn=(r-l+1);
}
}
ma[e]=i;
}
// cout<<x<<" "<<y<<" "<<ma[e]<<" "<<ll<<" "<<rr<<endl;
}
if(flag) cout<<ll<<" "<<rr<<endl;
else cout<<"-1\n";
}
return 0;
}