题意
给你一个只有‘G’和‘S’的字符串,可以交换两个字符的位置,问可以使得只有G的子段的最大长度是多少?
思路
模拟就行,但是情况比较麻烦。我们可以把每两个SS之间的G的长度存下来,并且统计一下非0段的个数。然后相邻两段相加,再加是否可替换,求一个MAX即可。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+5;
int n;
char s[MAXN];
int main()
{
scanf("%d%s", &n, s+1);
s[0] = s[n+1] = 'S';
int cnt = 0, G = 0;
vector<int> v;
for (int i = 0; i <= n+1; i++)
{
if (s[i] == 'G') cnt++;
else v.push_back(cnt), G += (cnt != 0), cnt = 0;
}
int ans = 0;
for (int i = 1; i < v.size(); i++)
{//cout << v[i] << " ";
ans = max(ans, v[i - 1] + v[i] + (G > (v[i - 1] != 0) + (v[i] != 0)));
}//cout << endl;
printf("%d\n", ans);
return 0;
}
/*
10
GGGSGGGSGG
5
GGSGG
6
GGSSGG
8
GGSGGSGG
7
SGGSGGS
10
GGGSSSGGSG
*/