제출 #441665

#제출 시각아이디문제언어결과실행 시간메모리
441665MladenPSelling RNA Strands (JOI16_selling_rna)C++17
100 / 100
237 ms112212 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...