Submission #1231359

#TimeUsernameProblemLanguageResultExecution timeMemory
1231359yixuan19Mutating DNA (IOI21_dna)C++20
43 / 100
1592 ms3388 KiB
#include "dna.h"
#include <vector>
#include <iostream>
#include <unordered_map>
#define N 100001

using namespace std;
vector <int> s1;
vector <int> s2;

unordered_map <char,int> convert;
bool st2 = true;

void init(std::string a, std::string b) {
    st2 = true;
    convert['A'] = 0;
    convert['C'] = 1;
    convert['T'] = 2;
	for (int i = 0; i < a.size(); ++i){
        if (a[i] == 'C' || b[i] == 'C'){
            st2 = false;
        } 
		s1.push_back(convert[a[i]]);
        s2.push_back(convert[b[i]]);
	}
}

int get_distance(int x, int y) {
    vector<int>section1;
    vector<int>section2;
    int num1A = 0;
    int num1T = 0;
    int num2A = 0;
    int num2T = 0;
    if (!st2){
        vector<int> occ1(3,0);
        vector<int> occ2(3,0);
        
        for (int i = x; i <= y; ++i){
            occ1[s1[i]]++;
            section1.push_back(s1[i]);
        }
        for (int i = x; i <= y; ++i){
            occ2[s2[i]]++;
            section2.push_back(s2[i]);
        }
        if (occ1 != occ2){
            return -1;
        }
    
        if (section1 == section2){
            return 0;
        }

        swap(section1[0], section1[1]);
        if (section1 == section2){
            return 1;
        }
        swap(section1[0], section1[1]);

        swap(section1[1], section1[2]);
        if (section1 == section2){
            return 1;
        }
        swap(section1[1], section1[2]);

        swap(section1[0], section1[2]);
        if (section1 == section2){
            return 1;
        }
        swap(section1[0], section1[2]);
        return 2;
    }else{
        section1.resize(0);
        section2.resize(0);
        for (int i = x; i <= y; ++i){
            num1A += (s1[i] == 0);
            num2A += (s2[i] == 0);
            if (s1[i] != s2[i]){
                section1.push_back(s1[i]);
                section2.push_back(s2[i]);
            }
        }
        // for(int i: section1){
        //     cout<<i<<' ';
        // }
        // cout<<"size "<<section1.size()<<endl;
        if (num1A != num2A){
            return -1;
        }else{
            return (int)section1.size()/2;
        }
    }
}
#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...