Codeforces Round 617 (Div. 3) - C. Yet Another Walking Robot(模拟)

坐标平面上有一个机器人。最初,机器人位于点 ( 0 , 0 ) (0, 0) (0,0) 。它的路径被描述为长度为 n n n 的字符串 s s s ,由字符 “L”、“R”、“U”、"D "组成。

每个字符都对应着某个移动:

  • L"(左):表示机器人从点 ( x , y ) (x, y) (x,y) 移动到点 ( x − 1 , y ) (x - 1, y) (x1,y)
  • R’(右):表示机器人从点 ( x , y ) (x, y) (x,y) 移动到点 ( x + 1 , y ) (x + 1, y) (x+1,y)
  • U"(向上):表示机器人从点 ( x , y ) (x, y) (x,y) 移动到点 ( x , y + 1 ) (x, y + 1) (x,y+1)
  • D"(向下):表示机器人从点 ( x , y ) (x, y) (x,y) 移动到点 ( x , y − 1 ) (x, y - 1) (x,y1)

创建该机器人的公司要求您以某种方式优化机器人的路径。为此,您可以删除路径中的个非空子串。但这家公司不希望他们的客户注意到机器人行为的变化。这意味着,如果在优化之前,机器人的路径终点是 ( x e , y e ) (x_e, y_e) (xe,ye) ,那么在优化之后(即删除 s s s 中的某个子串),机器人的路径终点也是 ( x e , y e ) (x_e, y_e) (xe,ye)

这个优化是一个低预算项目,因此您需要删除可能的最短非空***子串,以优化机器人的路径,使其路径的终点不变。你有可能无法优化路径。此外,优化后的目标路径也有可能是空字符串(即删除的子串是整个字符串 s s s )。

回想一下, s s s 的子串就是从 s s s 中删除一定量的前缀字符(可能为零)和后缀字符(可能为零)后得到的字符串。例如,"LURLLR "的子串有 “LU”、“LR”、“LURLLR”、“URL”,但没有 "RR "和 “UL”。

您必须回答 t t t 个独立的测试用例。

输入

输入的第一行包含一个整数 t t t ( 1 ≤ t ≤ 1000 1 \le t \le 1000 1t1000 ) - 测试用例的数量。

接下来的 2 t 2t 2t 行描述测试用例。每个测试用例都有两行。测试用例的第一行包含一个整数 n n n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 1 \le n \le 2 \cdot 10^5 1n2105 ) - 机器人路径的长度。测试用例的第二行包含一个字符串 s s s ,由 n n n 个字符 “L”、“R”、“U”、"D "组成,即机器人的路径。

保证所有测试用例中 n n n 的总和不超过 2 ⋅ 1 0 5 2 \cdot 10^5 2105 ( ∑ n ≤ 2 ⋅ 1 0 5 \sum n \le 2 \cdot 10^5 n2105 )。

输出

对于每个测试案例,都要打印上面的答案。如果无法删除机器人路径端点不变的非空子串,则打印-1。否则,打印两个整数 l l l r r r ,即 1 ≤ l ≤ r ≤ n 1 \le l \le r \le n 1lrn --您删除的子串的端点。 r − l + 1 r-l+1 rl+1 应该是最小值。如果有多个答案,请打印其中任意一个。


这题同样给出了一个新奇且重要的思想,我们不必计算向左右或者上下移动的次数是否相同,可以直接记录坐标,如果当前更新的坐标是之前出现过的,就直接取到之前的坐标为启始,当前坐标为末尾,直接删掉中间的这一段串就可以。

#include<iostream>
#include<map>
using namespace std;
#define pii pair<int,int>

void solve(){
	map<pii,int>vis;
	int n;cin >> n;
	
	int x = 0,y = 0;
	
	int st = 0,ed = 1e9;

	vis[{0,0}] = 0; 
	for(int i = 1;i <= n;i++){
		char c;cin >> c;

		x = x - (c == 'L') + (c == 'R');
		y = y + (c == 'U') - (c == 'D');

		//这里一定要用count,如果直接判断vis[{x,y}]是否为不为0的数会出错,map初始数据不确定
		if(vis.count({x,y}) && i - vis[{x,y}] < ed - st){
			st = vis[{x,y}] + 1,ed = i;
		}


		vis[{x,y}] = i;
	}
	
	if(ed == 1e9)cout << -1 << endl;
	else cout << st << " " << ed << endl;
	
	return;
}

int main(){
	int t;cin >> t;
	while(t--){
		solve();
	}
	return 0;
}
  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Codeforces Round 894 (Div. 3) 是一个Codeforces举办的比赛,是第894轮的Div. 3级别比赛。它包含了一系列题目,其中包括题目E. Kolya and Movie Theatre。 根据题目描述,E. Kolya and Movie Theatre问题要求我们给定两个字符串,通过三种操作来让字符串a等于字符串b。这三种操作分别为:交换a中相同位置的字符、交换a中对称位置的字符、交换b中对称位置的字符。我们需要先进行一次预处理,替换a中的字符,然后进行上述三种操作,最终得到a等于b的结果。我们需要计算预处理操作的次数。 根据引用的讨论,当且仅当b[i]==b[n-i-1]时,如果a[i]!=a[n-i-1],需要进行一次操作;否则不需要操作。所以我们可以遍历字符串b的前半部分,判断对应位置的字符是否与后半部分对称,并统计需要进行操作的次数。 以上就是Codeforces Round 894 (Div. 3)的简要说明和题目E. Kolya and Movie Theatre的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Codeforces Round #498 (Div. 3) (A+B+C+D+E+F)](https://blog.csdn.net/qq_46030630/article/details/108804114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Codeforces Round 894 (Div. 3)A~E题解](https://blog.csdn.net/gyeolhada/article/details/132491891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值