이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "dna.h"
#include <bits/stdc++.h>
using namespace std;
const int inf = 1e18;
struct Fenwick{
vector<int> bit;
Fenwick(int n){
bit.resize(2 * n + 2,0);
}
void update(int i){
for(i++;i < (int)(bit.size());i += i & -i)bit[i]++;
}
int get(int i){
int ans = 0;
for(i++;i;i -= i & -i)ans += bit[i];
return ans;
}
int query(int x,int y){
return get(y) - get(x-1);
}
};
vector<Fenwick> fwt;
int get(char c){
if(c == 'A')return 0;
if(c == 'T')return 1;
return 2;
}
void init(string A, string B) {
int n = A.length();
fwt.resize(9,Fenwick(n));
for(int i = 0;i<n;i++){
int a = get(A[i]);
int b = get(B[i]);
fwt[a * 3 + b].update(i);
}
}
int32_t get_distance(int x, int y) {
int at = fwt[1].query(x,y);
int ac = fwt[2].query(x,y);
int tc = fwt[5].query(x,y);
int ta = fwt[3].query(x,y);
int ca = fwt[6].query(x,y);
int ct = fwt[7].query(x,y);
int ans = 0;
int tmp = min(at,ta);
ans += tmp;
at -= tmp;
ta -= tmp;
tmp = min(ac,ca);
ans += tmp;
ac -= tmp;
ca -= tmp;
tmp = min(tc,ct);
ans+=tmp;
tc-=tmp;
ct-=tmp;
if(ac + at + tc + ta + ca + ct == 0)return ans;
if(!((ac && ct && ta) || (at && tc && ca)))return -1;
if(ac){
if(ac != ct || ac != ta)return -1;
ans += ac*2;
}else{
if(ca != tc || ca != at)return -1;
ans += ca*2;
}
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
dna.cpp:8:17: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
8 | const int inf = 1e18;
| ^~~~
# | 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... |