제출 #1239928

#제출 시각아이디문제언어결과실행 시간메모리
1239928antromancapSelling RNA Strands (JOI16_selling_rna)C++20
100 / 100
136 ms144984 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 1, MX = 2e6 + 1; int n, Q, mp[256], l[MX], r[MX], it[2][MX], child[2][MX][4], cnt[2]; string a[N]; vector<int> v[MX]; void add(int id, int i, string &s) { int u = 0; if (id) reverse(s.begin(), s.end()); for (char ch : s) { int c = mp[ch]; if (!child[id][u][c]) child[id][u][c] = ++cnt[id]; u = child[id][u][c]; if (id) v[u].push_back(i); else { if (!l[u]) l[u] = i; r[u] = i; } } } int find(int id, string &s) { int u = 0; if (id) reverse(s.begin(), s.end()); for (char ch : s) { int c = mp[ch]; if (!child[id][u][c]) return 0; u = child[id][u][c]; } return u; } int main() { ios::sync_with_stdio(0); cin.tie(0); mp['A'] = 0; mp['U'] = 1; mp['G'] = 2; mp['C'] = 3; cin >> n >> Q; for (int i = 1; i <= n; i++) cin >> a[i]; sort(a + 1, a + n + 1); for (int i = 1; i <= n; i++) { add(0, i, a[i]); add(1, i, a[i]); } for (int i = 1; i <= Q; i++) { string p, q; cin >> p >> q; int x = find(0, p); int y = find(1, q); cout << upper_bound(v[y].begin(), v[y].end(), r[x]) - lower_bound(v[y].begin(), v[y].end(), l[x]) << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...