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;
}