Submission #789730

#TimeUsernameProblemLanguageResultExecution timeMemory
789730LiudasMutating DNA (IOI21_dna)C++17
100 / 100
323 ms58516 KiB
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
string s, s1;
vector<int> dif;
vector<array<int, 3>> need, got;
vector<map<string, int>> seq;
void init(string a, string b){
    s = a;
    s1 = b;
    dif.assign(s.size(), 0);
    need.assign(s.size(), {0,0,0});
    got.assign(s.size(), {0,0,0});
    map<char, int> _map = {{'A',0},{'C',1},{'T',2}};
    map<string, int> map2 = {{"AT",0},{"TA", 0},{"AC",0},{"CA",0},{"CT",0},{"TC", 0}};
    vector<int> n1(3,0), n2(3,0);
    seq.resize(s.size());
    int t = 0, diff = 0;
    for(int i = 0; i < s.size(); i ++){
        string lo = string(1, s1[i]), ol = string(1, s[i]);
        string lol = lo + ol;
        if(s1[i] != s[i]){
            map2[lol]++;
            n1[_map[s[i]]]++;
            n2[_map[s1[i]]]++;
            diff++;
        }
        for(auto[l,r]:map2){
            seq[i][l] = r;
        }
        for(int j = 0; j < 3; j ++){
            need[i][j] = n1[j];
            got[i][j] = n2[j];
        }
        dif[i] = diff;
    }
}
int get_distance(int x, int y){
    int score = 0;
    array<int, 3> d1, d2;
    map<string, int> retard;
    for(int i = 0; i < 3; i ++){
        d1[i] = need[y][i] - (x > 0 ? need[x-1][i] : 0);
        d2[i] = got[y][i] - (x > 0 ? got[x-1][i] : 0);
    }
    for(auto [l,r] : seq[y]){
        int a = r - (x > 0 ? seq[x-1][l] : 0);
        retard[l] = a;
    }
    int irl = 0;
    for(auto [l, r] : retard){
        int t = min(r, retard[string(1,l[1]) + string(1,l[0])]);
        retard[l] -= t;
        retard[string(1,l[1]) + string(1,l[0])] -= t;
        score += t;
        irl += retard[l];
    }
    if(d1 != d2){
        return -1;
    }
    else{
        return score + irl * 2 / 3;
    }
}

Compilation message (stderr)

dna.cpp: In function 'void init(std::string, std::string)':
dna.cpp:19:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |     for(int i = 0; i < s.size(); i ++){
      |                    ~~^~~~~~~~~~
dna.cpp:18:9: warning: unused variable 't' [-Wunused-variable]
   18 |     int t = 0, diff = 0;
      |         ^
#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...