[典·三元组]

发布时间 2023-07-02 11:37:30作者: Thecode_Wm

题目: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;
}