Submission #476420

#TimeUsernameProblemLanguageResultExecution timeMemory
476420Mahmudul_KabirDNA 돌연변이 (IOI21_dna)C++17
100 / 100
58 ms13304 KiB
//#include "dna.h"

#include "bits/stdc++.h"

#define sp <<" "
#define el <<"\n"
#define S second
#define F first
#define pb push_back
#define all(ar) ar.begin(),ar.end() 
#define pii pair<int,int> 

 
using namespace std;
using ll = long long; 
using ld = long double;
 
const ll mod = 100000007;
const ll si = 100005;
const ll inf = 7000; 

ll po[si][3], pt[si][3],n; 
unordered_map<char,ll> hau = {{'A',0},{'T',1},{'C',2}}; 
ll sco[si][6]; 

ll typ(char a,char b){
    if(a == 'A' && b == 'T') return 0; 
    else if(a == 'A' && b == 'C') return 1; 
    else if(a == 'T' && b == 'A') return 2; 
    else if(a == 'T' && b == 'C') return 3; 
    else if(a == 'C' && b == 'A') return 4; 
    else return 5; 
}


void init(std::string a, std::string b){
    n = a.size(); 
    memset(po,0,sizeof(po)); memset(pt,0,sizeof(pt)); memset(sco,0,sizeof(sco)); 
    po[0][hau[a[0]]] += 1; pt[0][hau[b[0]]] += 1;
    if(a[0] != b[0]) sco[0][typ(a[0],b[0])] += 1; 
    for(ll i = 1; i < n; i++){
        for(ll j = 0; j < 3; j++){
            po[i][j] = po[i - 1][j]; 
            pt[i][j] = pt[i - 1][j];
            sco[i][j] = sco[i - 1][j]; 
        }
        for(int j = 3; j < 6; j++) sco[i][j] = sco[i - 1][j];
        po[i][hau[a[i]]] += 1;
        pt[i][hau[b[i]]] += 1; 
        if(a[i] != b[i]) sco[i][typ(a[i],b[i])] += 1; 
    }
    //for(int i = 0; i < n; i++,cout el) for(int j = 0; j < 6; j++) cout<<sco[i][j] sp;  
    return; 
}

ll get(ll x,ll y,ll i,bool t){
    ll ans = t ? pt[y][i] : po[y][i]; 
    if(x) ans -= t ? pt[x - 1][i] : po[x - 1][i]; 
    return ans;  
}

ll get(ll x,ll y,ll t){
    ll ans = sco[y][t]; 
    if(x) ans -= sco[x - 1][t]; 
    return ans; 
}

bool hobe(ll x,ll y){
    //cout<<get(x,y,0,0) sp<< get(x,y,0,1) sp<<get(x,y,1,0) sp<< get(x,y,1,1) sp<<get(x,y,2,0) sp<< get(x,y,2,1) el; 
    return (get(x,y,0,0) == get(x,y,0,1)) && (get(x,y,1,0) == get(x,y,1,1)) && (get(x,y,2,0) == get(x,y,2,1)); 
}

int get_distance(int x, int y) {
    if(!hobe(x,y)) return -1; 
    ll at = get(x,y,0), ac = get(x,y,1), ta = get(x,y,2), tc = get(x,y,3), ca = get(x,y,4), ct = get(x,y,5);
    //cout<<at sp<<ta sp<<tc sp<<ct sp<<ac sp<<ca el;  
    ll ans = 0,mtc,mac,mat = min(at,ta); at -= mat; ta -= mat; ans += mat; 
    mtc = min(tc,ct); tc -= mtc; ct -= mtc; ans += mtc; 
    mac = min(ac,ca); ac -= mac; ca -= mac; ans += mac; 
    ans += max(at,ta) + max(tc,ct); 
    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...