zoukankan      html  css  js  c++  java
  • P1371 NOI元丹

    题意:给你一个字符串,只含NOI三个字母,现在你可以在任意位置添加NOI三个字母中的一个,只能添加一次,问你有最多有多少子串是NOI

    先求出不加字母的情况

    这题想出思路代码好写

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cctype>
    #include<algorithm>
    using namespace std;
    #define int long long
    #define olinr return
    #define _ 0
    #define love_nmr 0
    #define DB double
    inline int read()
    {
        int x=0,f=1;
        char ch=getchar();
        while(!isdigit(ch))
        {
            if(ch=='-')
                f=-f;
            ch=getchar();
        }
        while(isdigit(ch))
        {
            x=(x<<1)+(x<<3)+(ch^48);
            ch=getchar();
        }
        return x*f;
    }
    inline void put(int x)
    {
        if(x<0)
        {
            x=-x;
            putchar('-');
        }
        if(x>9)
            put(x/10);
        putchar(x%10+'0');
    }
    int n;
    char a[105000];
    int ans;
    int SN[105000];
    int SO[105000];
    int SI[105000];
    int PN[105000];
    int PO[105000];
    int PI[105000];
    int f[105000];
    int g[105000];
    int tot;
    signed main()
    {
        n=read();
        scanf("%s",a+1);
        for(int i=n;i>=1;i--)   //统计后缀和
        {
            SN[i]=SN[i+1];
            SO[i]=SO[i+1];
            SI[i]=SI[i+1];
            if(a[i]=='N') SN[i]++;
            if(a[i]=='O') SO[i]++;
            if(a[i]=='I') SI[i]++;
        }
        for(int i=1;i<=n;i++)   //统计前缀和
        {
            PN[i]=PN[i-1];
            PO[i]=PO[i-1];
            PI[i]=PI[i-1];
            if(a[i]=='N') PN[i]++;
            if(a[i]=='O') PO[i]++;
            if(a[i]=='I') PI[i]++;
        }
        for(int i=n;i>=1;i--)   //从i---n取OI的方法数
        {
            f[i]=f[i+1];
            if(a[i]=='O')
                f[i]+=SI[i];
        }
        for(int i=1;i<=n;i++)  //从1---i取NO的方法数
        {
            g[i]=g[i-1];
            if(a[i]=='O')
                g[i]+=PN[i];
        }
        int ans=0;         //不加字母的答案
        for(int i=n;i>=1;i--)   
        {
            if(a[i]=='N')
                ans+=f[i];   //累加g[i]答案也一样
        }
        for(int i=1;i<=n+1;i++)
        {
            tot=max(tot,ans+f[i]);    //在i前插入N
            tot=max(tot,ans+PN[i]*SI[i]);  //插入O
            tot=max(tot,ans+g[i]);   //插入I
        }
        put(tot);
        olinr ~~(0^_^0)+love_nmr;
    }
  • 相关阅读:
    软件体系架构复习要点
    Operating System on Raspberry Pi 3b
    2019-2020 ICPC North-Western Russia Regional Contest
    2019 ICPC ShenYang Regional Online Contest
    2019 ICPC XuZhou Regional Online Contest
    2019 ICPC NanChang Regional Online Contest
    2019 ICPC NanJing Regional Online Contest
    Codeforces Edu Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div.1+Div.2)
    AtCoder Beginning Contest 139
  • 原文地址:https://www.cnblogs.com/olinr/p/9594973.html
Copyright © 2011-2022 走看看