제출 #1191676

#제출 시각아이디문제언어결과실행 시간메모리
1191676PetrixDNA 돌연변이 (IOI21_dna)C++20
56 / 100
21 ms3912 KiB
#include <iostream>
#include <string>
#include <map>
#include "dna.h"
using namespace std;

string v1,v2;
map<pair<int,int>,int> frvv;
int spa[100001];
int spb[100001];
int spd[100001];
void init(string a,string b){
    v1=a;v2=b;int i;
    for(i=0;i<a.size();i++){
        if(i){
            spa[i]=spa[i-1];spb[i]=spb[i-1];spd[i]=spd[i-1];
        }
        if(a[i]=='A') spa[i]++;
        if(b[i]=='A') spb[i]++;
        if(a[i]!=b[i]) spd[i]++;
    }
}


int get_distance(int x,int y){
    if(y-x<=1e3){
        int cnt=0,i,auxcnt=0;int frv[3]={0,0,0},frv1[3]={0,0,0};
        frvv.clear();

        for(i=x;i<=y;i++){
            if(v1[i]=='T') frv[0]++;
            if(v2[i]=='T') frv1[0]++;

            if(v1[i]=='A') frv[1]++;
            if(v2[i]=='A') frv1[1]++;

            if(v1[i]=='C') frv[2]++;
            if(v2[i]=='C') frv1[2]++;
        }
        if(frv[0]!=frv1[0] || frv[1]!=frv1[1] || frv[2]!=frv1[2]) return -1;
        for(i=x;i<=y;i++){
            if(v1[i]!=v2[i] && !frvv[{v2[i],v1[i]}]){
                cnt++;frvv[{v1[i],v2[i]}]++;
            }else if(v1[i]!=v2[i]){
                cnt--;frvv[{v2[i],v1[i]}]--;auxcnt++;
            }
        }
        return max(cnt-1,0)+auxcnt;
    }else{
        if((x==0 && spa[y]!=spb[y]) || (x!=0 && spa[y]-spa[x-1]!=spb[y]-spb[x-1])) return -1;
        if(!x){
            return spd[y]/2;
        }else return (spd[y]-spd[x-1])/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...