Submission #1339882

#TimeUsernameProblemLanguageResultExecution timeMemory
1339882ElayV13Mutating DNA (IOI21_dna)C++20
100 / 100
41 ms7268 KiB
#include "dna.h"
#include "bits/stdc++.h"
using namespace std;

int pa[3][100001];
int pb[3][100001];
int cc[6][100001];

void init(string a,string b)
{
      int n=a.size();
      pa[0][0]=(a[0]=='A');
      pa[1][0]=(a[0]=='C');
      pa[2][0]=(a[0]=='T');
      for(int i=1;i<n;i++)
      {
            pa[0][i]=pa[0][i-1]+(a[i]=='A');
            pa[1][i]=pa[1][i-1]+(a[i]=='C');
            pa[2][i]=pa[2][i-1]+(a[i]=='T');
      }
      pb[0][0]=(b[0]=='A');
      pb[1][0]=(b[0]=='C');
      pb[2][0]=(b[0]=='T');
      for(int i=1;i<n;i++)
      {
            pb[0][i]=pb[0][i-1]+(b[i]=='A');
            pb[1][i]=pb[1][i-1]+(b[i]=='C');
            pb[2][i]=pb[2][i-1]+(b[i]=='T');
      }
      cc[0][0]=(b[0]=='A'&&a[0]=='C');
      cc[1][0]=(b[0]=='C'&&a[0]=='A');
      cc[2][0]=(b[0]=='A'&&a[0]=='T');
      cc[3][0]=(b[0]=='T'&&a[0]=='A');
      cc[4][0]=(b[0]=='C'&&a[0]=='T');
      cc[5][0]=(b[0]=='T'&&a[0]=='C');
      for(int i=1;i<n;i++)
      {
            cc[0][i]=cc[0][i-1]+(b[i]=='A'&&a[i]=='C');
            cc[1][i]=cc[1][i-1]+(b[i]=='C'&&a[i]=='A');
            cc[2][i]=cc[2][i-1]+(b[i]=='A'&&a[i]=='T');
            cc[3][i]=cc[3][i-1]+(b[i]=='T'&&a[i]=='A');
            cc[4][i]=cc[4][i-1]+(b[i]=='C'&&a[i]=='T');
            cc[5][i]=cc[5][i-1]+(b[i]=='T'&&a[i]=='C');
      }
}

int get(int l,int r,int x,int t){
      if(t==0){
            if(l==0) return pa[x][r];
            else return pa[x][r]-pa[x][l-1];
      }
      else{
            if(l==0) return pb[x][r];
            else return pb[x][r]-pb[x][l-1];
      }
}

int cnt(int l,int r,int x){
      if(l==0) return cc[x][r];
      else return cc[x][r]-cc[x][l-1];
}

int get_distance(int x,int y)
{
      vector<int>ca(3),cb(3);
      ca[0]=get(x,y,0,0);
      ca[1]=get(x,y,1,0);
      ca[2]=get(x,y,2,0);
      cb[0]=get(x,y,0,1);
      cb[1]=get(x,y,1,1);
      cb[2]=get(x,y,2,1);
      for(int i=0;i<3;i++) if(ca[i]!=cb[i]) return -1;
      int AC=cnt(x,y,0);
      int CA=cnt(x,y,1);
      int AT=cnt(x,y,2);
      int TA=cnt(x,y,3);
      int CT=cnt(x,y,4);
      int TC=cnt(x,y,5);
      int res=0;
      int s1=min(AC,CA);
      int s2=min(AT,TA);
      int s3=min(CT,TC);
      res+=s1;
      res+=s2;
      res+=s3;
      AC-=s1;
      CA-=s1;
      AT-=s2;
      TA-=s2;
      CT-=s3;
      TC-=s3;
      int add=(AC+CA+AT+TA+CT+TC);
      return (res+((add/3)*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...