This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#include "dna.h"
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define ff first
#define ss second
#define vi vector<int>
#define vl vector<ll>
#define vii vector<pii>
#define vll vector<pll>
#define FOR(i,N) for(i=0;i<(N);++i)
#define FORe(i,N) for(i=1;i<=(N);++i)
#define FORr(i,a,b) for(i=(a);i<(b);++i)
#define FORrev(i,N) for(i=(N);i>=0;--i)
#define F0R(i,N) for(int i=0;i<(N);++i)
#define F0Re(i,N) for(int i=1;i<=(N);++i)
#define F0Rr(i,a,b) for(ll i=(a);i<(b);++i)
#define F0Rrev(i,N) for(int i=(N);i>=0;--i)
#define all(v) (v).begin(),(v).end()
#define dbgLine cerr<<" LINE : "<<__LINE__<<"\n"
#define ldd long double
using namespace std;
#define MAXN 100005
int N;
int pre[3][MAXN];
int trans[3][3][MAXN];
inline int toint(char c){
return (c == 'A' ? 0 : (c == 'C' ? 1 : 2));
}
void init(string A, string B){
N = A.size();
F0R(a, 3){
F0R(b, 3){
F0R(i, N){
trans[a][b][i] = 0;
}
}
}
F0R(a, 3){
F0R(i, N){
pre[a][i] = 0;
}
}
F0R(i, N){
if(i){
F0R(a, 3){
pre[a][i] = pre[a][i - 1];
F0R(b, 3){
trans[a][b][i] = trans[a][b][i - 1];
}
}
}
++pre[toint(A[i])][i];
--pre[toint(B[i])][i];
++trans[toint(A[i])][toint(B[i])][i];
}
}
inline bool ok(int x, int y){
if(x){
return pre[0][y] == pre[0][x - 1] && pre[1][y] == pre[1][x - 1] && pre[2][y] == pre[2][x - 1];
}else{
return pre[0][y] == 0 && pre[1][y] == 0 && pre[2][y] == 0;
}
}
int get_distance(int x, int y){
if(!ok(x, y)){
return -1;
}
int res[3][3];
F0R(a, 3){
F0R(b, 3){
res[a][b] = trans[a][b][y];
if(x){
res[a][b] -= trans[a][b][x - 1];
}
// cerr << "res[" << a << "][" << b << "] = " << res[a][b] << '\n';
}
}
int cnt[3];
cnt[0] = min(res[0][1], res[1][0]);
res[0][1] -= cnt[0];
res[1][0] -= cnt[0];
cnt[1] = min(res[2][1], res[1][2]);
res[2][1] -= cnt[1];
res[1][2] -= cnt[1];
cnt[2] = min(res[0][2], res[2][0]);
res[0][2] -= cnt[2];
res[2][0] -= cnt[2];
// F0R(a, 3){
// cerr << "cnt[" << a << "] = " << cnt[a] << '\n';
// }
return cnt[0] + cnt[1] + cnt[2] + ((res[0][1] + res[1][0]) << 1);
}
/*
signed main(){
string A, B;
int Q;
cin >> A >> B >> Q;
init(A, B);
while(Q--){
int x, y;
cin >> x >> y;
cout << get_distance(x, y) << '\n';
}
return 0;
}
*/
/*
ACTATA
ATACAT
3
1 3
3 5
4 5
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |