제출 #483706

#제출 시각아이디문제언어결과실행 시간메모리
483706tredsused70DNA 돌연변이 (IOI21_dna)C++17
100 / 100
46 ms8212 KiB
#include <bits/stdc++.h>
//#pragma GCC optimize("O3")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx,avx2")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2")
 
using namespace std;
 
#define accelerator ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define fi first
#define se second
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int nmax=200011,mod=1000000007,inf=2000010000,key=200003;
const ll infll=4000000000000000000;
const ld eps=1e-7;
 
string a,b;
int cntc[nmax][3]={0},mas1[nmax]={0},mas2[nmax]={0},cnt[nmax][3][3]={0};

void cnv(string s,int mas[])
{
    int n=s.size();
    for(int i=0;i<n;i++)
    {
        if(s[i]=='A')
        {
            mas[i+1]=0;
            continue;
        }
        if(s[i]=='T')
            mas[i+1]=1;
        else
            mas[i+1]=2;
    }
    return ;
}
 
void init(string a,string b)
{
    cnv(a,mas1);
    cnv(b,mas2);
    int n=a.size();
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<3;j++)
            cntc[i+1][j]=cntc[i][j];
        cntc[i+1][mas1[i+1]]++;
        cntc[i+1][mas2[i+1]]--;
        for(int j=0;j<3;j++)
            for(int k=0;k<3;k++)
                cnt[i+1][j][k]=cnt[i][j][k];
        cnt[i+1][mas1[i+1]][mas2[i+1]]++;
    }
    return ;
}
 
int count_swaps(int mas[3][3])
{
    int ans=0,t;
    for(int i=0;i<3;i++)
    {
        mas[i][i]=0;
        for(int j=i+1;j<3;j++)
        {
            t=min(mas[i][j],mas[j][i]);
            ans+=t;
            mas[i][j]-=t;
            mas[j][i]-=t;
        }
    }
    t=0;
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            t+=mas[i][j];
    ans+=2*t/3;
    return ans;
}
 
int get_distance(int l,int r)
{
    r++;
    for(int i=0;i<3;i++)
    {
        if(cntc[l][i]!=cntc[r][i])
            return -1;
    }
    int cntt[3][3];
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
        {
            cntt[i][j]=cnt[r][i][j];
            cntt[i][j]-=cnt[l][i][j];
        }
    return count_swaps(cntt);
}
#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...