Submission #1010419

#TimeUsernameProblemLanguageResultExecution timeMemory
1010419induwara16Mutating DNA (IOI21_dna)C++17
0 / 100
26 ms9688 KiB
#include <bits/stdc++.h>
using namespace std;

typedef string str;
typedef vector<int> vi;

str a, b;
vi ac, at, ca, ct, ta, tc, as1, cs1, ts1, as2, cs2, ts2;

void init(str a1, str b1)
{
    a = a1;
    b = b1;

    int n = a.length();

    ac = vi(n);
    at = vi(n);
    ca = vi(n);
    at = vi(n);
    ta = vi(n);
    tc = vi(n);

    for (int i = 0; i < n; i++)
    {
        switch (b[i])
        {
        case 'A':
            as2[i] = i == 0 ? 1 : as2[i - 1] + 1;
            cs2[i] = i == 0 ? 0 : cs2[i - 1];
            ts2[i] = i == 0 ? 0 : ts2[i - 1];
            break;
        case 'C':
            as2[i] = i == 0 ? 0 : as2[i - 1];
            cs2[i] = i == 0 ? 1 : cs2[i - 1] + 1;
            ts2[i] = i == 0 ? 0 : ts2[i - 1];
            break;
        case 'T':
            as2[i] = i == 0 ? 0 : as2[i - 1];
            cs2[i] = i == 0 ? 0 : cs2[i - 1];
            ts2[i] = i == 0 ? 1 : ts2[i - 1] + 1;
            break;
        }
        switch (a[i])
        {
        case 'A':
            as1[i] = i == 0 ? 1 : as1[i - 1] + 1;
            cs1[i] = i == 0 ? 0 : cs1[i - 1];
            ts1[i] = i == 0 ? 0 : ts1[i - 1];
            if (b[i] == 'C')
                ac[i] = i == 0 ? 1 : ac[i - 1] + 1;
            else
                ac[i] = i == 0 ? 0 : ac[i - 1];
            if (b[i] == 'T')
                at[i] = i == 0 ? 1 : at[i - 1] + 1;
            else
                at[i] = i == 0 ? 0 : at[i - 1];
            break;
        case 'C':
            as1[i] = i == 0 ? 0 : as1[i - 1];
            cs1[i] = i == 0 ? 1 : cs1[i - 1] + 1;
            ts1[i] = i == 0 ? 0 : ts1[i - 1];
            if (b[i] == 'A')
                ca[i] = i == 0 ? 1 : ca[i - 1] + 1;
            else
                ca[i] = i == 0 ? 0 : ca[i - 1];
            if (b[i] == 'T')
                ct[i] = i == 0 ? 1 : ct[i - 1] + 1;
            else
                ct[i] = i == 0 ? 0 : ct[i - 1];
            break;
        case 'T':
            as1[i] = i == 0 ? 0 : as1[i - 1];
            cs1[i] = i == 0 ? 0 : cs1[i - 1];
            ts1[i] = i == 0 ? 1 : ts1[i - 1] + 1;
            if (b[i] == 'C')
                tc[i] = i == 0 ? 1 : tc[i - 1] + 1;
            else
                tc[i] = i == 0 ? 0 : tc[i - 1];
            if (b[i] == 'A')
                ta[i] = i == 0 ? 1 : ta[i - 1] + 1;
            else
                ta[i] = i == 0 ? 0 : ta[i - 1];
            break;
        }
    }
}

int get_distance(int x, int y)
{
    if (
        (as1[y] - (x == 0 ? 0 : as1[x - 1])) != (as2[y] - (x == 0 ? 0 : as2[x - 1])) ||
        (cs1[y] - (x == 0 ? 0 : cs1[x - 1])) != (cs2[y] - (x == 0 ? 0 : cs2[x - 1])) ||
        (ts1[y] - (x == 0 ? 0 : ts1[x - 1])) != (ts2[y] - (x == 0 ? 0 : ts2[x - 1])))
        return -1;

    int cntAC = ac[y] - (x == 0 ? 0 : ac[x - 1]);
    int cntAT = at[y] - (x == 0 ? 0 : at[x - 1]);
    int cntCA = ca[y] - (x == 0 ? 0 : ca[x - 1]);
    int cntCT = ct[y] - (x == 0 ? 0 : ct[x - 1]);
    int cntTA = ta[y] - (x == 0 ? 0 : ta[x - 1]);
    int cntTC = tc[y] - (x == 0 ? 0 : tc[x - 1]);

    int c = 0, m = cntAC + cntCA + cntAT + cntTA + cntTC + cntTC;

    m -= min(cntAC, cntCA) * 2;
    c += min(cntAC, cntCA);

    m -= min(cntAT, cntTA) * 2;
    c += min(cntAT, cntTA);

    m -= min(cntTC, cntCT) * 2;
    c += min(cntTA, cntCT);

    return m / 3 * 2 + c;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...