Submission #1196942

#TimeUsernameProblemLanguageResultExecution timeMemory
1196942ivazivaMutating DNA (IOI21_dna)C++20
100 / 100
27 ms7176 KiB
#include <bits/stdc++.h>
#include "dna.h"

using namespace std;

#define MAXN 100001

int n;
int pref[2][3][MAXN],br[6][MAXN];
map<char,int> mapa;

void init(std::string a, std::string b)
{
    n=a.size();mapa['A']=0;mapa['C']=1;mapa['T']=2;
    for (int i=1;i<=n;i++)
    {
        for (int j=0;j<=2;j++) {pref[0][j][i]=pref[0][j][i-1];pref[1][j][i]=pref[1][j][i-1];}
        pref[0][mapa[a[i-1]]][i]++;pref[1][mapa[b[i-1]]][i]++;
        for (int j=0;j<=5;j++) br[j][i]=br[j][i-1];
        if (a[i-1]==b[i-1]) continue;
        if (a[i-1]=='A' and b[i-1]=='C') br[0][i]++;
        if (a[i-1]=='A' and b[i-1]=='T') br[1][i]++;
        if (a[i-1]=='C' and b[i-1]=='T') br[2][i]++;
        if (a[i-1]=='C' and b[i-1]=='A') br[3][i]++;
        if (a[i-1]=='T' and b[i-1]=='A') br[4][i]++;
        if (a[i-1]=='T' and b[i-1]=='C') br[5][i]++;
    }
}

int get_distance(int x,int y)
{
    x++;y++;int ans=0;
    if (pref[0][0][y]-pref[0][0][x-1]!=pref[1][0][y]-pref[1][0][x-1]) return -1;
    if (pref[0][1][y]-pref[0][1][x-1]!=pref[1][1][y]-pref[1][1][x-1]) return -1;
    if (pref[0][2][y]-pref[0][2][x-1]!=pref[1][2][y]-pref[1][2][x-1]) return -1;
    int br0=br[0][y]-br[0][x-1],br1=br[1][y]-br[1][x-1],br2=br[2][y]-br[2][x-1];
    int br3=br[3][y]-br[3][x-1],br4=br[4][y]-br[4][x-1],br5=br[5][y]-br[5][x-1];
    int value0=min(br0,br3);br0-=value0;br3-=value0;ans+=value0;
    int value1=min(br1,br4);br1-=value1;br4-=value1;ans+=value1;
    int value2=min(br2,br5);br2-=value2;br5-=value2;ans+=value2;
    ans+=2*max(br0,br3);return ans;
}
#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...