D. Journey(模拟)

Problem - D - Codeforces

D. Journey(模拟)_第1张图片

有n + 1个城市,从0到n。n条道路连接这些城市,第i条道路连接城市i- 1和i (i E [1, n])。每条路都有一个方向。方向由n个字符组成的字符串给出,每个字符都是L或r。如果第i个字符是L,这意味着第i条路最初是从城市i到城市i -1;否则它从城市i-1到城市i。旅行者想要参观这个国家尽可能多的城市。最初,他们会选择一个城市开始他们的旅程。每天,旅行者必须从他们当前所在的城市通过其中一条道路前往邻近的城市,只有当这条道路与他们要去的方向相同时,他们才能沿着这条道路前进;换句话说,如果一条路是从城市i到城市i+1,它可以从i到i+1,但不能从i+1到i。当旅行者移动到邻近的城市后,所有的路都改变了方向,变成相反的方向。如果旅行者不能从他们现在的城市到邻近的城市,他们的旅程就结束了;旅行者也可以随时结束旅程。旅行者的目标是访问尽可能多的不同城市(他们可以多次访问一个城市,但只计算第一次访问)。对于每个城市i,如果旅行者从城市i出发,计算他们在一次旅行中可以访问的不同城市的最大数量。输入第一行包含一个整数t (1 < t < 104)——测试用例的数量。每个测试用例由两行组成。第一行包含一个整数n (1 < n < 3- 105)。第二行包含字符串s,由n个字符组成,每个字符都是L或R。它保证所有测试用例的n的和不超过3 - 105。输出对于每个测试用例,打印n +1个整数。第i个整数应该等于旅行者在一次旅行中可以访问的最大不同城市的数量(如果这次旅行是从第i个城市开始的话)。

Example

input

Copy

2
6
LRRRLL
3
LRL

output

Copy

1 3 2 3 1 3 2
1 4 1 4

题解:
通过观察,我们可以发现,如果一个点向往左走,应该是LRLRLRLRLR

如果一个点往右走,应该是RLRLRLRLRL

所以模拟每个点最左最右可以走到哪即可

 

#include 
#include 
#include 
#include
#include
#include
#include
using namespace std;
typedef long long ll;
//#define int long long
int l[300050],r[300050];
void solve()
{
	int n;
	cin >> n;
	string s;
	cin >> s;
	s = " " + s;
	int now = 0;
	for(int i = 1;i <= n;i++)
	{
		if(s[i] != s[i - 1])
		now++;
		else
		now = 1;
		if(s[i] == 'L')
		{
			l[i] = now;
		}
	}
	now = 0;
	for(int i = n;i >= 1;i--)
	{
		if(s[i] != s[i + 1])
		{
			now++;
		}
		else
		{
			now = 1;
		}
		if(s[i] == 'R')
		{
			r[ i - 1] = now;
		}
	}
	for(int i = 0;i <= n;i++)
	{
		cout << l[i] + r[i]  + 1<<" ";
		l[i] = 0,r [i] = 0;
	}
	printf("\n");
}

signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	int t = 1;
	cin >> t;
	while(t--)
	{
		solve(); 
	}
}

你可能感兴趣的:(模拟)