Submission #715865

#TimeUsernameProblemLanguageResultExecution timeMemory
715865rt144Selling RNA Strands (JOI16_selling_rna)C++17
100 / 100
148 ms140108 KiB
#include <bits/stdc++.h> using namespace std; int n, m; struct pi { int l, r; }; int ctoi(char a) { if (a=='A') return 0; if (a=='G') return 1; if (a=='C') return 2; return 3; } static char buf[450 << 20]; void* operator new(size_t s) { static size_t i = sizeof buf; assert(s < i); return (void*)&buf[i -= s]; } void operator delete(void*) noexcept {} struct PTrie { int l = 0, r = 1e5+1; PTrie* ch[4]={nullptr, nullptr, nullptr, nullptr}; void insert(string &a, int si, int i) { if (si==a.size()) { return; } int nx = ctoi(a[si]); if (!ch[nx]) ch[nx] = new PTrie{}, ch[nx]->r = ch[nx]->l = i; else ch[nx]->r = i; // i will always be the latest we have seen ch[nx]->insert(a, si+1, i); } pi prefix(string &a, int si) { if (si==a.size()) return {l, r}; int nx = ctoi(a[si]); if (ch[nx]) return ch[nx]->prefix(a, si+1); else return {-1, -1}; } }; struct QTrie { vector<int> ss; bool std = false; QTrie* ch[4]={nullptr, nullptr, nullptr, nullptr}; void insert(string &a, int si, int i) { if (si==a.size()) { return; } int nx = ctoi(a[si]); if (!ch[nx]) ch[nx] = new QTrie{}; ch[nx]->ss.push_back(i); ch[nx]->insert(a, si+1, i); } int prefix(string &a, int si, int l, int r) { if (si==a.size()) { if (!std) sort(begin(ss), end(ss)), std = true; return upper_bound(begin(ss), end(ss), r)-lower_bound(begin(ss), end(ss), l); } int nx = ctoi(a[si]); if (ch[nx]) return ch[nx]->prefix(a, si+1, l, r); else return 0; } }; int main() { cin.tie(nullptr)->sync_with_stdio(false); cin >> n >> m; vector<string> S(n); PTrie pt; QTrie qt; for (int i=0;i<n;i++) cin >> S[i]; sort(begin(S), end(S)); for (int i=0;i<n;i++) pt.insert(S[i], 0, i), reverse(begin(S[i]), end(S[i])), qt.insert(S[i], 0, i); for (int i=0;i<m;i++) { string p, q; cin >> p >> q; reverse(begin(q), end(q)); auto [l, r] = pt.prefix(p, 0); cout << qt.prefix(q, 0, l, r) << '\n'; } }

Compilation message (stderr)

selling_rna.cpp: In member function 'void PTrie::insert(std::string&, int, int)':
selling_rna.cpp:21:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   21 |   if (si==a.size()) { return; }
      |       ~~^~~~~~~~~~
selling_rna.cpp: In member function 'pi PTrie::prefix(std::string&, int)':
selling_rna.cpp:28:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |   if (si==a.size()) return {l, r};
      |       ~~^~~~~~~~~~
selling_rna.cpp: In member function 'void QTrie::insert(std::string&, int, int)':
selling_rna.cpp:39:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |   if (si==a.size()) { return; }
      |       ~~^~~~~~~~~~
selling_rna.cpp: In member function 'int QTrie::prefix(std::string&, int, int, int)':
selling_rna.cpp:46:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |   if (si==a.size()) {
      |       ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...