# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
752798 | racsosabe | Selling RNA Strands (JOI16_selling_rna) | C++14 | 152 ms | 196560 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace::std;
const int N = 100000 + 5;
const int SUML = 2000000 + 5;
const int E = 4;
const string alphabet = "AGCU";
int id(char c) {
for(int i = 0; i < alphabet.size(); i++) {
if(alphabet[i] == c) return i;
}
assert(false);
}
int n;
int m;
int T = 1;
int nodes;
int in[N];
int out[N];
int res[N];
string s[N];
string Q[N];
int sorted[N];
int frec[SUML];
int trie[E][SUML];
vector<int> ids[SUML];
vector<int> pending[N];
void add_node() {
for(int i = 0; i < E; i++) trie[i][nodes] = 0;
frec[nodes] = 0;
ids[nodes].clear();
nodes += 1;
}
void insert(string &s, int to) {
int pos = 0;
for(int i = 0; i < s.size(); i++) {
int c = id(s[i]);
if(trie[c][pos] == 0) {
trie[c][pos] = nodes;
add_node();
}
pos = trie[c][pos];
frec[pos] += 1;
}
ids[pos].emplace_back(to);
}
void sort_strings(int u = 0) {
in[u] = T;
for(auto x : ids[u]) {
sorted[T++] = x;
}
for(int c = 0; c < E; c++) {
if(!trie[c][u]) continue;
sort_strings(trie[c][u]);
}
out[u] = T - 1;
}
int query(string &s) {
int pos = 0;
for(int i = 0; i < s.size(); i++) {
int c = id(s[i]);
if(!trie[c][pos]) return 0;
pos = trie[c][pos];
}
return frec[pos];
}
void solve() {
nodes = 0;
add_node();
for(int i = 1; i < T; i++) {
insert(s[sorted[i]], 0);
for(auto to : pending[i]) {
if(to < 0) {
res[-to] -= query(Q[-to]);
}
else {
res[to] += query(Q[to]);
}
}
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
nodes = 1;
for(int i = 1; i <= n; i++) {
cin >> s[i];
insert(s[i], i);
}
sort_strings();
for(int i = 1; i <= m; i++) {
string P;
cin >> P >> Q[i];
reverse(Q[i].begin(), Q[i].end());
int pos = 0;
for(int j = 0; j < P.size(); j++) {
int c = id(P[j]);
if(!trie[c][pos]) {
pos = -1;
break;
}
pos = trie[c][pos];
}
if(~pos) {
pending[in[pos] - 1].emplace_back(-i);
pending[out[pos]].emplace_back(i);
}
}
for(int i = 1; i <= n; i++) reverse(s[i].begin(), s[i].end());
solve();
for(int i = 1; i <= m; i++) cout << res[i] << '\n';
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | 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... |