其他分享
首页 > 其他分享> > 字符串魔法(easy)

字符串魔法(easy)

作者:互联网

链接: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;
}

标签:子串,upl,num1,魔法,down,easy,字符串,upr
来源: https://blog.csdn.net/qq_44527245/article/details/110950594