Submission #597233

#TimeUsernameProblemLanguageResultExecution timeMemory
597233serizeMutating DNA (IOI21_dna)C++17
56 / 100
111 ms23780 KiB
#include "dna.h"
#include <bits/stdc++.h>
#include <cstdio>
#include <cassert>
#include <string>
#include <vector>
#define all(x) x.begin(),x.end()

using namespace std;
const int MAX = 1e5+2;

vector<int> dif(MAX);
string s1, s2;

int mat_s1[30][MAX], mat_s2[30][MAX];

void init(std::string a, std::string b) {
    int n = a.size();
    for(auto i: a){
        int x = (int)(i);
        x += 32;
        s1.push_back( (char)(x) );
    }
    for(auto i: b){
        int x = (int)(i);
        x += 32;
        s2.push_back( (char)(x) );
    }
    for(int i = 1; i <= n; i++){
       dif[i] = (a[i-1]!=b[i-1])?1:0;
       dif[i] += dif[i-1];
       char x = s1[i-1], y = s2[i-1];
       mat_s1[ (int)(x-'a') ][i] = 1;
       mat_s2[ (int)(y-'a') ][i] = 1;
    }
    for(char i = 'a'; i <= 'z'; i++){
        int abc = (int)(i-'a');
        for(int j = 1; j <= n; j++){
            mat_s1[abc][j] += mat_s1[abc][j-1];
            mat_s2[abc][j] += mat_s2[abc][j-1];
        }
    }
}

int get_distance(int x, int y) {
	if(y-x == 0){
        if(s1[x] != s2[x]) return -1;
        else return 0;
    }
    else{
        bool ok = 1;
        for(char i = 'a'; i <= 'z'; i++){
            int abc = (int)(i-'a');
            int cnt1 = (mat_s1[abc][y+1]-mat_s1[abc][x]);
            int cnt2 = (mat_s2[abc][y+1]-mat_s2[abc][x]);
            if(cnt1 != cnt2) ok = 0;
        }
        if(ok == false) return -1;
        int d = dif[y+1]-dif[x];
        if(d&1) return ( (d>>1)+1 );
        else return (d>>1);
    }
    return 0;
}
#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...