70pts求助,悬赏一关
  • 板块P1371 NOI元丹
  • 楼主Tjaweiof
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/17 17:47
  • 上次更新2024/1/17 20:40:40
查看原帖
70pts求助,悬赏一关
550933
Tjaweiof楼主2024/1/17 17:47

RT

#include <bits/stdc++.h>
using namespace std;
int n, N[100001], O[100001], I[100001], maxn, a[100001], b[100001], OO[100001], OO2[100001], ans;
string s;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	cin >> s;
	for (int i = s.size() - 1; i >= 0; i--){
		N[i] = N[i + 1];
		O[i] = O[i + 1];
		OO[i] = O[i + 1];
		I[i] = I[i + 1];
		if (s[i] == 'N'){
			N[i]++;
		} else if (s[i] == 'O'){
			O[i]++;
			OO[i]++;
		} else {
			I[i]++;
		}
	}
	if (s[0] == 'O'){
		OO2[0] = 1;
	}
	for (int i = 1; i >= 0; i--){
		OO2[i] = OO2[i - 1];
		if (s[i] == 'O'){
			OO2[i]++;
		}
	}
	for (int i = 0; i < s.size(); i++){
		maxn = max(maxn, I[i] * (N[0] - N[i]));
		if (s[i] == 'O'){
			a[i] = I[i];
		}
	}
	for (int i = s.size() - 1; i >= 0; i--){
		OO[i] = OO[i + 1] + a[i];
		if (s[i] == 'N'){
			ans += OO[i];
		}
	}
	for (int i = s.size() - 1; i >= 0; i--){
		if (s[i] == 'O'){
			b[i] = N[0] - N[i];
		}
	}
	for (int i = 0; i < s.size(); i++){
		OO2[i] = OO2[i - 1] + b[i];
	}
	cout << max(ans + maxn, max(ans + OO[0], ans + OO2[s.size() - 1]));
	return 0;
}

2024/1/17 17:47
加载中...