题目链接
题意:
枕头大战,RL分别代表攻击方向,每次操作可以修改一个人的方向使得枕头大战的所有人都满足逻辑:如果只有一个人打你那么你必须打他,如果两边的人都没有打你或者是都在打你那么你打谁都行。
思路:
我们可以很容易的判断出三个连续的R或者是L都是不允许的,所以我们只需要将RRR或者LLL的末尾变成L或R即可,这样可以合理的利用每一次操作,需要注意的是要从每一个连续的R或L开始判断,因为是成环的,所以我们不能直接从头开始,还要注意当三个连续的R或L之后的字母不同时要将第二个R或L改变,因为这种情况改变末尾会导致后面可能多出现一个三个连续的R或L。
代码:
#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=2e6+7;
const int M=2e4+5;
const double eps=1e-8;
const int mod=998244353;
const int inf=0x7fffffff;
const double pi=3.1415926;
using namespace std;
int a[N],flag[N];
signed main()
{
IOS;
int t;
cin>>t;
while(t--)
{
int n,sum=0,num=0;
cin>>n;
string s;
cin>>s;
if((s.substr(0,3)=="LLL"||s.substr(0,3)=="RRR")&&n==3)
{
cout<<1<<endl;
continue;
}
int ans=0;
for(int i=1;i<n;i++)
{
if(s[i]!=s[i-1])
{
ans=1;
break;
}
}
if(ans==1)
{
for(int i=n-1;i>=0;i--)
{
if(s[i]==s[0])
{
num--;
}
else
{
break;
}
}
}
for(int i=num;i<n+num;i++)
{
if(s[(i+n)%n]==s[(i-1+n)%n]&&s[(i-1+n)%n]==s[(i-2+n)%n])
{
sum++;
if(s[(i+1+n)%n]==s[(i+n)%n])
{
if(s[(i+n)%n]=='R')
{
s[(i+n)%n]='L';
}
else
{
s[(i+n)%n]='R';
}
}
else
{
if(s[(i-1+n)%n]=='R')
{
s[(i-1+n)%n]='L';
}
else
{
s[(i-1+n)%n]='R';
}
}
}
}
cout<<sum<<endl;
}
return 0;
}