题目大意就是让一个'S'和'G'更换一下位置,然后更换后的字符串里连续'G'串的最大长度。
用一个Gnt1记录第一段一共有多少个'G‘,Gnt2记录第二段有几个'G',立一个flag来记录序列是否终止,即遇到'S'更新flag的值,同时也更新前边隔段的数值为零。用ans记录当前为止相邻两段最长的'G'序列,这里我们假设'S'可以和这两段外的另外的'G'进行更换,等到最后和总的'G'的个数Gnt比,若比Gnt大则说明我们假设错误,把ans更新为Gnt即可,否则则说明假设正确,直接输出即可。附代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
char ch[100100];
scanf("%d",&n);
getchar();
scanf("%s",ch);
int Gnt = 0,Gnt1 = 0,Gnt2 = 0,flag = 0,ans = 0;
for(int i = 0;i < n; i++)
{
if(ch[i] == 'G')
{
Gnt++;
if(!flag)
Gnt1++;
if(flag)
Gnt2++;
}
else
{
flag = !flag;
if(!flag)
Gnt1 = 0;
else
Gnt2 = 0;
}
ans = max(ans,Gnt1 + Gnt2 + 1);
}
if(ans > Gnt)
ans = Gnt;
printf("%d",ans);
return 0;
}