Решение задачи "Очередной идущий робот" с Codeforces

Без пояснения   Просмотров: 9


На координатной плоскости стоит робот. Изначально он расположен в точке (0,0). Его путь описывается строкой s длины n, состоящей из символов 'L', 'R', 'U', 'D'.

Каждый из этих символов соответствует некоторому ходу:

'L' (влево): робот перемещается из точки (x,y) в точку (x−1,y);
'R' (вправо): робот перемещается из точки (x,y) в точку (x+1,y);
'U' (вверх): робот перемещается из точки (x,y) в точку (x,y+1);
'D' (вниз): робот перемещается из точки (x,y) в точку (x,y−1).
Компания, которая создала этого робота, попросила вас оптимизировать путь робота некоторым образом. Чтобы сделать это, вы можете удалить любую непустую подстроку пути. Но эта компания не хочет, чтобы покупатели заметили перемену в поведении робота. Это означает, что если до оптимизации робот заканчивал свой путь в точке (xe,ye), то после оптимизации (т.е. удаления некоторой единственной подстроки из s) робот тоже должен заканчивать свой путь в точке (xe,ye).

Эта оптимизация — малобюджетный проект, поэтому вам нужно удалить кратчайшую возможную непустую подстроку, чтобы оптимизировать путь робота так, что конечная точка его пути не изменится. Возможна ситуация, когда вы не можете оптимизировать путь. Кроме того, возможно, что после оптимизации полученный путь станет пустой строкой (т.е. удаленная подстрока — это вся строка s).

Напомним, что подстрока строки s — это такая строка, которая может быть получена из s с помощью удаления некоторого числа символов (возможно, нулевого) из префикса и некоторого количества символов (возможно, нулевого) из суффикса. Например, подстроками «LURLLR» являются «LU», «LR», «LURLLR», «URL», но не «RR» и «UL».

Вам нужно ответить на t независимых наборов входных данных.

Код

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
	  map<pair<int,int>,int>m;
	  int n;
	  cin>>n;
	  string s;
	  cin>>s;
	  int x=0,y=0;
	  int l=0,r=10000000;
	  m[make_pair(x,y)]=1;
	  for(int i=0;i<n;i++)
	  {
	  	if(s[i]=='R')
	  	x++;
	  	if(s[i]=='L')
	  	x--;
	  	if(s[i]=='U')
	  	y++;
	  	if(s[i]=='D')
	  	y--;
	    if(m[make_pair(x,y)])
	    {
	    	if(r-l+1>i+2-m[make_pair(x,y)])
	    	r=i+1,l=m[make_pair(x,y)];
		}
		m[make_pair(x,y)]=i+2;
	  }
	  if(r==10000000)
	  cout<<"-1"<<endl;
	  else
	  cout<<l<<" "<<r<<endl;
	}
}

         

 Администратор Photo Автор: Администратор


Отправить решение задачи
Чтобы отправить решение вам нужно войти в систему или зарегистрироваться

Комментарии

Чтобы написать комментарии вам нужно войти в систему или зарегистрироваться