大家来康康本蒟蒻的蒟蒻代码(新一轮纠错游戏)
查看原帖
大家来康康本蒟蒻的蒟蒻代码(新一轮纠错游戏)
533488
Immortal_Xiao楼主2021/12/8 21:47
#include <bits/stdc++.h> // 万能头文件,不知道的可以上网了解一下,超好用
using namespace std;

int n, sn[100005], si[100005]; // sn代表N在i之前的个数,si代表I在i之后的个数
long long maxn = -1;
string s; // NOI串

long long doing()
{
	for (int i = 0; i <= n - 1; i++)
    {
        sn[i] = sn[i - 1] + (s.at(i) == 'N'); // 前缀和计算
    }
    for (int i = n - 1; i >= 0; i--)
    {
        si[i] = sn[i + 1] + (s.at(i) == 'I'); // 前缀和计算
    }
    long long sum = 0;
    for (int i = 0; i <= n - 1; i++)
    {
        if (s.at(i) == 'O')
        {
            sum += sn[i] * si[i]; // 计算个数(注:因为s.at(i)在此处必定为O,所以使用sn[i]与si[i]、sn[i - 1]与si[i + 1]效果一样)
        }
    }
    return sum;
}

int main()
{
    cin >> n >> s;
    for (int i = 0; i <= n - 1; i++)
    {
        sn[i] = sn[i - 1] + (s.at(i) == 'N'); // 前缀和计算
    }
    for (int i = n - 1; i >= 0; i--)
    {
        si[i] = sn[i + 1] + (s.at(i) == 'I'); // 前缀和计算
    }
    s.insert(0, 1, 'N');
    maxn = max(maxn, doing());
    s.erase(0, 1); // N情况
    s.insert(s.length() - 1, 1, 'I');
    maxn = max(maxn, doing());
    s.erase(s.length() - 1, 1); // I情况
    for (int i = 0; i <= n - 1; i++)
    {
        s.insert(i, 1, 'O');
        maxn = max(maxn, doing());
        s.erase(i, 1);
    } // O情况
    cout << maxn << endl;
    return 0;
}
2021/12/8 21:47
加载中...