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;
    }
  • 相关阅读:
    定时器
    按键中断部分的理解
    初中数学
    WING IDE 快捷键
    机器学习各种网址
    SQL With As 用法Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
    Python编码格式导致的csv读取错误
    Oracle中的rownum 和rowid的用法和区别
    oracle配置
    matplotlib命令与格式:标题(title),标注(annotate),文字说明(text)
  • 原文地址:https://www.cnblogs.com/olinr/p/9594973.html
Copyright © 2011-2022 走看看