# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1142211 | programming23 | Mutating DNA (IOI21_dna) | C++20 | 0 ms | 0 KiB |
void init(string a, string b) {
stringA = a;
stringB = b;
int ln = stringA.size();
arrCount.resize(ln);
int count = 0;
for(int i=ln-1; i>0;i--){
if (stringA[i] != stringB[i]){
count+=1;
}
arrCount[i] = count;
}
}
int get_distance(int x, int y) {
string sA = stringA;
string sB = stringB;
map<char, int> countsB;
map<char, int> countsA;
int ln = sA.size();
int count = 0;
for(int i=x; i <= y; i++){
if(countsA.find(sA[i]) == countsA.end()){
countsA[sA[i]] = 1;
}else{
countsA[sA[i]] +=1;
}
if(countsB.find(sB[i]) == countsB.end()){
countsB[sB[i]] = 1;
}else{
countsB[sB[i]] +=1;
}
}
int lnA = countsA.size();
int lnB = countsB.size();
if(lnA != lnB){
return -1;
}for(auto c: countsA){
if(countsA[c.first] != countsB[c.first]){
return -1;
}
}
if(lnA == 2 && lnB == 2){
count = arrCount[0];
if(y+1 <= ln){
count-=arrCount[y+1];
}
if(x-1 >= 0){
count -= arrCount[x-1];
}
return count/2;
}
int i=x;
while (i <= y && sA != sB){
char c = sA[i];
if(c == sB[i]){
i++;
continue;
}
for(int z=i+1; z <= y; z++){
if(sA[z] != sB[i] || sA[z] == sB[z]){
continue;
}
sA[i] = sA[z];
sA[z] = c;
i++;
count++;
}
}
return count;
}