题目:MEX 来源:AtCoder Beginner Contest 308
根据例1可以先进行判断,如果根据E的不同情况进行统计的话方便入手
1.从左到右统计M的{0,1,2}的情况
2.从右到左统计X的{0,1,2}的情况
3.判断当前s[i]为‘E’的情况下,并且对应的a[i]={0,1,2}三种情况相乘的个数(乘的是三元组的没出现的最小非负整数)(太典了)
const int N = 2e6 + 10; int n, m; LL ans; int a[N], M[N][3], E[N][3], X[N][3]; string s; void solve() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; cin >> s; for (int i = 1; i <= n; i++) { char ch = s[i - 1]; M[i][0] = M[i - 1][0]; M[i][1] = M[i - 1][1]; M[i][2] = M[i - 1][2]; if (ch == 'M')M[i][a[i]]++; } for (int i = n; i >= 1; i--) { char ch = s[i - 1]; X[i][0] = X[i + 1][0]; X[i][1] = X[i + 1][1]; X[i][2] = X[i + 1][2]; if (ch == 'X')X[i][a[i]]++; } for (int i = 1; i <= n; i++) { char ch = s[i - 1]; if (ch == 'E') { if (a[i] == 0) { ans += (LL)M[i][0] * X[i][0]; //M=0,X=0,E=a[i]=0; ans += (LL)M[i][0] * X[i][1] * 2; ans += (LL)M[i][0] * X[i][2]; ans += (LL)M[i][1] * X[i][0] * 2; ans += (LL)M[i][1] * X[i][1] * 2; ans += (LL)M[i][1] * X[i][2] * 3; ans += (LL)M[i][2] * X[i][0]; ans += (LL)M[i][2] * X[i][1] * 3; ans += (LL)M[i][2] * X[i][2]; } else if (a[i] == 1) { ans += (LL)M[i][0] * X[i][0] * 2; ans += (LL)M[i][0] * X[i][1] * 2; ans += (LL)M[i][0] * X[i][2] * 3; ans += (LL)M[i][1] * X[i][0] * 2; ans += (LL)M[i][1] * X[i][1] * 0; ans += (LL)M[i][1] * X[i][2] * 0; ans += (LL)M[i][2] * X[i][0] * 3; ans += (LL)M[i][2] * X[i][1] * 0; ans += (LL)M[i][2] * X[i][2] * 0; } else if (a[i] == 2) { ans += (LL)M[i][0] * X[i][0] * 1; ans += (LL)M[i][0] * X[i][1] * 3; ans += (LL)M[i][0] * X[i][2] * 1; ans += (LL)M[i][1] * X[i][0] * 3; ans += (LL)M[i][1] * X[i][1] * 0; ans += (LL)M[i][1] * X[i][2] * 0; ans += (LL)M[i][2] * X[i][0] * 1; ans += (LL)M[i][2] * X[i][1] * 0; ans += (LL)M[i][2] * X[i][2] * 0; } } } cout << ans << endl; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t = 1; while (t--) { solve(); } return 0; }
标签:ch,int,cin,三元组,情况,统计 From: https://www.cnblogs.com/crismiao/p/17520524.html