字串魔法(easy)

slh-slh發表於2020-12-10

連結: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;
}