玄 学 问 题
查看原帖
玄 学 问 题
1023961
Ryzen_9_9950X3D楼主2024/3/31 20:45

RT,这段代码在C++98标准下不开O2会RE70分,开了O2能AC,问各位大佬是什么情况?

#include <bits/stdc++.h>
using namespace std;
#define int long long
int f[100005],g[100005];
int a;
int noi(char cr[])
{
    int N = 0,NO = 0,NOI = 0;
    for(int i = 0;i <= a;i++)
    {
        if(cr[i] == 'N') N++;
        if(cr[i] == 'O') NO += N;
        if(cr[i] == 'I') NOI += NO;
    }
    return NOI;
}
signed main()
{
    cin >> a;
    char b[100005];
    gets(b);
    gets(b);
    char c[100005],d[100005],e[100005];
    for(int i = 0;i < a;i++)
    {
        c[i + 1] = d[i] = e[i] = b[i];
    }
    c[0] = 'N';
    e[a] = 'I';
    int mx = 0,mxp;
    for(int i = 0;i < a;i++) f[i] = f[i - 1] + (b[i] == 'N');
    for(int i = a - 1;i >= 0;i--) g[i] = g[i + 1] + (b[i] == 'I');
    for(int i = 0;i < a;i++)
    {
        if(f[i - 1] * g[i] > mx)
        {
            mx = f[i] * g[i];
            mxp = i;
        }
    }
    char ff[100005];
    for(int i = mxp;i < a;i++) ff[i - mxp] = ff[i - mxp] + b[i];
    d[mxp] = 'O';
    char d_[100005];
    for(int i = 0;i <= mxp;i++)
    {
        d_[i] = d[i];
    }
    memset(d,0,sizeof(d));
    for(int i = 0;i <= mxp;i++) d[i] = d_[i];
    for(int i = mxp + 1;i <= a;i++) d[i] += ff[i - mxp - 1];
    cout << max(noi(c),max(noi(d),noi(e)));
    return 0;
}

开了O2
没开O2

2024/3/31 20:45
加载中...