이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define all(x) begin(x),end(x)
#define endl '\n'
using namespace std;
#define MAXL 2000010
#define MAXN 100010
int prefT[MAXL][4], suffT[MAXL][4], idx[MAXL], siz[MAXL], bit[MAXL], en[MAXL], cross[MAXL];
int rez[MAXN], prefIdx, suffIdx, nodeQ[MAXN];
vector<int> q[MAXL];
void update(int idx, int val) {
while(idx < MAXL) {
bit[idx] += val;
idx += idx&-idx;
}
}
int query(int idx) {
int rez = 0;
while(idx > 0) {
rez += bit[idx];
idx -= idx&-idx;
}
return rez;
}
int timer;
int eulerDFS(int node) {
idx[node] = ++timer;
siz[node] = 1;
for(int i = 0; i < 4; i++) {
if(suffT[node][i]) siz[node] += eulerDFS(suffT[node][i]);
}
return siz[node];
}
void solveDFS(int node) {
for(auto x : q[node]) {
int nd = nodeQ[x];
rez[x] -= (query(idx[nd]+siz[nd]-1) - query(idx[nd]-1));
}
for(int i = 0; i < 4; i++) {
if(prefT[node][i]) solveDFS(prefT[node][i]);
}
update(idx[cross[node]], +en[node]);
for(auto x : q[node]) {
int nd = nodeQ[x];
rez[x] += (query(idx[nd]+siz[nd]-1) - query(idx[nd]-1));
}
}
int ch(char c) {
if(c == 'A') return 0;
if(c == 'G') return 1;
if(c == 'C') return 2;
if(c == 'U') return 3;
}
int add(int trie[][4], string &s, int &idxx, int save) {
int node = 0, i = 0, n = s.size();
while(i < n) {
int c = ch(s[i]);
if(!trie[node][c]) trie[node][c] = ++idxx;
node = trie[node][c];
i++;
}
if(save) en[node]++;
return node;
}
int findT(int trie[][4], string &s) {
int node = 0, i = 0, n = s.size();
while(i < n) {
int c = ch(s[i]);
if(!trie[node][c]) return -1;
node = trie[node][c];
i++;
}
return node;
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int N, M; cin >> N >> M;
for(int i = 1; i <= N; i++) {
string x; cin >> x;
int nP = add(prefT, x, prefIdx, 1);
reverse(all(x));
int nS = add(suffT, x, suffIdx, 0);
cross[nP] = nS;
}
eulerDFS(0);
for(int i = 1; i <= M; i++) {
string P, Q; cin >> P >> Q;
reverse(all(Q));
int nodeP = findT(prefT, P);
nodeQ[i] = findT(suffT, Q);
if(nodeP != -1 && nodeQ[i] != -1) {
q[nodeP].push_back(i);
}
}
solveDFS(0);
for(int i = 1; i <= M; i++) {
cout << rez[i] << endl;
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
selling_rna.cpp: In function 'int ch(char)':
selling_rna.cpp:52:1: warning: control reaches end of non-void function [-Wreturn-type]
52 | }
| ^
# | 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... |