链接:https://ac.nowcoder.com/acm/contest/9680/B
来源:牛客网
白浅获得了一个仅由A和B组成的字符串。他可以至多使用一次魔法来改变字符串。 魔法的定义:选择一个字典序不递增的子串, 然后使得这个子串变成字典序不递减的子串,即变成形如AAA…AAABBB…BBB这样的字符串。 他想知道,在他至多使用一次魔法后,这个字符串能够出现的最长的字典序不递减的子串的长度为多少。
输入描述:
输入第一行包含一个整数n,代表字符串的长度
接下来一行给出一个长度为n的字符串(1≤n≤200000)
输出描述:
输出一行一个正整数表示答案。
示例1
输入
6
AABBAA
输出
6
说明
选择”BBAA”的子串,使用魔法变成AABB,则整个字符串变为AAAABB,所以最长不递减子串长度为6。
#include <stdio.h>
#define max(a, b) (a > b ? a : b)
char s[1000001];
char st[11];
int down[1000001], upl[1000001], upr[1000001];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt", "r", stdin);
#endif
int i, j, n, m;
int flag = 0, v = -1, l, r;
int num1 = 0, num2 = 0, max1 = 0;
scanf("%d", &n);
fgets(st, 11, stdin);
scanf("%s", s);
down[0] = 1;
for (i = 1; i < n; i++)
{
if (s[i] <= s[i - 1])
{
down[i] = down[i - 1] + 1;
}
else
{
down[i] = 1;
}
}
upl[0] = 1;
for (i = 1; i < n; i++)
{
if (s[i] >= s[i - 1])
{
upl[i] = upl[i - 1] + 1;
}
else
{
upl[i] = 1;
}
}
upr[n - 1] = 1;
for (i = n - 2; i >= 0; i--)
{
if (s[i] <= s[i + 1])
{
upr[i] = upr[i + 1] + 1;
}
else
{
upr[i] = 1;
}
}
for (i = 0; i < n; i++)
{
l = i - down[i] + 1;
r = i;
if (l - 1 >= 0 && s[r] >= s[l - 1])
{
num1 += upl[l - 1];
}
if (r + 1 < n && s[l] <= s[r + 1])
{
num1 += upr[r + 1];
}
num1+=down[i];
max1 = max(max1, num1);
num1 = 0;
}
printf("%d\n", max1);
return 0;
}