题目描述
塔利娅是一位国际象棋的传奇大师。她有n个奖杯,从1到n排成一排(从左到右),每个奖杯旁边都有一盏灯(灯的编号与奖杯的编号一样)。
一盏灯可以指向左边或右边,它照亮那个方向的所有奖杯(但不照亮它旁边的那个)。更正式地说,Thalia有一个仅由字符'L'和'R'组成的字符串s,代表灯的当前方向。灯的i点亮了。
trophies 1,2,...,i-1 如果si是'L'。
如果si是'R',奖杯i+1,i+2,...,n。
她最多可以进行一次以下操作。
选择一个索引i(1≤i<n)。
调换灯i和i+1(不改变其方向)。也就是说,将si与si+1互换。
塔利亚要求你照亮她所有的奖杯(使每个奖杯至少被一盏灯照亮),或者告诉她不可能这样做。如果有可能,你可以选择执行操作或什么都不做。注意,灯不能改变方向,只允许调换相邻的灯。
输入
每个测试包含多个测试案例。第一行包含测试用例的数量t(1≤t≤10000)。测试用例的描述如下。
每个测试用例的第一行包含一个正整数n (2≤n≤100000) - 奖杯的数量。
每个测试案例的第二行包含一个长度为n的字符串s,仅由字符'L'和'R'组成--第i个字符描述第i个灯的方向。
保证所有测试案例的n之和不超过100000。
输出
对于每个测试案例,如果不可能通过执行一个操作(或什么都不做)来照亮所有的奖杯,则打印-1。否则,如果你选择不执行该操作,则打印0(即通过灯的初始位置照亮奖杯),如果你选择调换灯i和i+1,则打印索引i(1≤i<n)。
如果有多个答案,请打印任何一个。
例子
输入
6
2
LL
2
LR
2
RL
2
RR
7
LLRLLLR
7
RRLRRRL
输出
-1
1
0
-1
3
6
注意
在第一个例子中,可以交换灯1和灯2,或者什么都不做。在任何情况下,都可以得到 "LL "这个字符串。不是所有的奖杯都被照亮,因为奖杯2没有被任何灯照亮--灯1没有照亮,灯2只照亮奖杯1。
在第二个例子中,有必要将灯1和灯2对调。这条线变成了 "RL"。奖杯1由灯2照亮,奖杯2由灯1照亮,因此有可能照亮所有的奖杯。
在第三个例子中,所有奖杯最初都被照亮--因此,不执行任何操作是一个有效的解决方案。
在最后两个例子中,由于所有奖杯最初都被照亮,所以执行交换是没有必要的。但是,所提出的解决方案也是有效的。
思路
全L全R就-1,有RL就0,没RL交换LR
代码
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
string s;
cin>>s;
int f=0,l=0;
for(int i=0;i<n;i++)
{
if(s[i]=='R')
{
f=i+1;
for(int j=i+1;j<n;j++)
{
if(s[j]=='L')
{
l=j+1;
break;
}
}
}
}
int g=0;
for(int i=0;i<n;i++)
{
if(s[i]=='L')g=1;
}
if((f==0&&l==0)||(g==0))cout<<-1<<endl;
else if(f<l)cout<<0<<endl;
else
{
for(int i=f-1;i>=0;i--)
{
if(s[i]=='L')
{
cout<<i+1<<endl;
break;
}
}
}
}
}