Submission #947446

#TimeUsernameProblemLanguageResultExecution timeMemory
947446GrandTiger1729Selling RNA Strands (JOI16_selling_rna)C++17
100 / 100
124 ms94952 KiB
#include <bits/stdc++.h> using namespace std; inline void convert(string &s) { int n = s.size(); for (int i = 0; i < n; i++) { if (s[i] == 'G') { s[i] = 'B'; } if (s[i] == 'U') { s[i] = 'D'; } } } const int K = 4; struct Trie { struct Node { int cnt = 0; Node *ch[K]{}; }; Node *rt = new Node(); void add(const string &s) { Node *cur = rt; int n = s.size(); for (int i = 0; i < n; i++) { if (cur->ch[s[i] - 'A'] == nullptr) { cur->ch[s[i] - 'A'] = new Node(); } cur = cur->ch[s[i] - 'A']; cur->cnt++; } } int query(const string &s) { Node *cur = rt; int n = s.size(); for (int i = 0; i < n; i++) { if (cur->ch[s[i] - 'A'] == nullptr) { return 0; } cur = cur->ch[s[i] - 'A']; } return cur->cnt; } }; int main() { cin.tie(0)->sync_with_stdio(0); int n, q; cin >> n >> q; vector<string> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; convert(a[i]); } sort(a.begin(), a.end()); vector<string> b(q); vector<vector<int>> ll(n + 1), rr(n + 1); for (int i = 0; i < q; i++) { string s; cin >> s >> b[i]; convert(s); convert(b[i]); reverse(b[i].begin(), b[i].end()); int l = lower_bound(a.begin(), a.end(), s) - a.begin(); s.back()++; int r = lower_bound(a.begin(), a.end(), s) - a.begin(); ll[l].push_back(i); rr[r].push_back(i); } Trie tr; vector<int> ans(q); for (int t = 0; t <= n; t++) { for (auto id : rr[t]) { ans[id] += tr.query(b[id]); } for (auto id : ll[t]) { ans[id] -= tr.query(b[id]); } if (t < n) { reverse(a[t].begin(), a[t].end()); tr.add(a[t]); } } for (int i = 0; i < q; i++) { cout << ans[i] << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...