Submission #1277213

#TimeUsernameProblemLanguageResultExecution timeMemory
1277213quanduongxuan12Mutating DNA (IOI21_dna)C++20
100 / 100
23 ms9360 KiB
#include "dna.h"
#include <bits/stdc++.h>
using namespace std;
#define name "dna"
#define MAXN 100005
#define pb push_back
#define pf push_front
#define ll long long
#define ii pair<int, int>
#define fs first
#define sc second
#define ill pair<int, ll>
#define lli pair<ll, int>
#define llll pair<ll, ll>
#define all(v) v.begin(),v.end()
#define uni(v) v.erase(unique(all(v)),v.end())
#define bit(n,i) (((n)>>(i))&1)
#define FOR(i,a,b) for (int i=(a),_b=(b); i<=_b; i++)
#define FORD(i,a,b) for (int i=(a),_b=(b); i>=_b; i--)
#define MASK(i) (1LL<<(i))
const int INF=1e9;
const int MOD=1e9+7;
void add(int &u, int v){
    u+=v;
    if (u>=MOD) u-=MOD;
}
void sub(int &u, int v){
    u-=v;
    if (u<0) u+=MOD;
}
void minimize(int &u, int v){
    u=min(u,v);
}
void maximize(int &u, int v){
    u=max(u,v);
}
long long Rand(long long l, long long r){
    ll tmp=0;
    FOR(i,1,4) tmp=((tmp<<15)^(((1<<15)-1)&rand()));
    return l+tmp%(r-l+1);
}
int cnt[MAXN][3][3];
int cnt_A[MAXN][3];
int cnt_B[MAXN][3];
int c[MAXN],d[MAXN];
void init(string a, string b){
    int n=(int)a.size();
    a=" "+a;
    b=" "+b;
    FOR(i,1,n){
        if (a[i]=='A') c[i]=0;
        else if (a[i]=='T') c[i]=1;
        else c[i]=2;
        if (b[i]=='A') d[i]=0;
        else if (b[i]=='T') d[i]=1;
        else d[i]=2;
    }
    FOR(i,1,n){
        FOR(j,0,2) cnt_A[i][j]=cnt_A[i-1][j];
        cnt_A[i][c[i]]++;
        FOR(j,0,2) cnt_B[i][j]=cnt_B[i-1][j];
        cnt_B[i][d[i]]++;
        FOR(j,0,2) FOR(k,0,2) cnt[i][j][k]=cnt[i-1][j][k];
        cnt[i][c[i]][d[i]]++;
    }
}
int get_distance(int x, int y){
    ++x;
    ++y;
    FOR(i,0,2){
        if (cnt_A[y][i]-cnt_A[x-1][i]!=cnt_B[y][i]-cnt_B[x-1][i]) return -1;
    }
    int ans=0;
    int cnt01=cnt[y][0][1]-cnt[x-1][0][1];
    int cnt10=cnt[y][1][0]-cnt[x-1][1][0];
    int cnt02=cnt[y][0][2]-cnt[x-1][0][2];
    int cnt20=cnt[y][2][0]-cnt[x-1][2][0];
    int cnt12=cnt[y][1][2]-cnt[x-1][1][2];
    int cnt21=cnt[y][2][1]-cnt[x-1][2][1];
    int tmp;
    //0,1
    tmp=min(cnt01,cnt10);
    ans+=tmp;
    cnt01-=tmp;
    cnt10-=tmp;
    //0,2
    tmp=min(cnt02,cnt20);
    ans+=tmp;
    cnt02-=tmp;
    cnt20-=tmp;
    //1,2
    tmp=min(cnt12,cnt21);
    ans+=tmp;
    cnt12-=tmp;
    cnt21-=tmp;
    int u=max(cnt01,cnt10);
    int v=max(cnt02,cnt20);
    return ans+u+v;
}
#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...