C. Yet Another Walking Robot
题意
给一个字符串,每种字符都代表一个坐标变换,让求删除一个最短的子串(不为空)使得删除这个子串后最终坐标点位置不变,找到了输出子串的起始位置和结束位置,若找不出这样一个子串,那么输出-1,字符串下标从1~n。
分析
用到了差分的思想,如果,截掉 l ∽ r l\backsim r l∽r,这部分的话,要求 x [ l − 1 ] = x [ r ] x[l-1]=x[r] x[l−1]=x[r]、 y [ l − 1 ] = y [ r ] y[l-1]=y[r] y[l−1]=y[r]。
代码
map<pair<int,int>,int>mp;
main(void)
{
int t=read();
while(t--)
{
mp.clear();
int n=read();
string s;
cin>>s;
int x=0;
int y=0;
mp[{x,y}]=1; //表示1-1=0位置的x,y值为0。
int l=0;
int r=n;
for(int i=0;i<s.size();i++)
{
if(s[i]=='L'){
x--;
}
else if(s[i]=='R'){
x++;
}
else if(s[i]=='U'){
y++;
}
else{
y--;
}
if(mp[{x,y}]!=0&&i+1-mp[{x,y}]+1<r-l+1)//如果前面出现过相同的(x,y),而且与答案比较后更优。
{
l=mp[{x,y}];
r=i+1;
}
mp[{x,y}]=i+2;//更新表示i+1位置的(x,y),如果(x,y)出现过,上边已经判断了上一个m[{x,y}]中的是否可以作为答案(作为左边界,因为右边界是新出现的)。
}
if(l==0)
cout<<"-1"<<endl;
else
cout<<l<<" "<<r<<endl;
}
}