Submission #784987

#TimeUsernameProblemLanguageResultExecution timeMemory
784987vjudge1Selling RNA Strands (JOI16_selling_rna)C++17
100 / 100
225 ms272688 KiB
#include <bits/stdc++.h> using namespace std; int chrToHash[256]{}; int n, m; vector<string> str; vector<int> results; struct TrieNode { int cnt = 0; int l = -1, r = -1; vector<int> v; string* ogString{}; TrieNode* children[4]{}; void depthFirstSearch(int& timer); }; vector<TrieNode*> trieNodes; void TrieNode::depthFirstSearch(int& timer) { l = timer, timer += cnt; for (int i = 0; i < cnt; i++) trieNodes.push_back(this); for (auto &child : children) { if (child == nullptr) continue; child->depthFirstSearch(timer); } r = timer; } struct Trie { TrieNode *root = new TrieNode; void insert(string& s) { auto curr = root; int size = (int)s.size(); for (int i = 0; i < size; i++) { int d = chrToHash[s[i]]; if (curr->children[d] == nullptr) curr->children[d] = new TrieNode; curr = curr->children[d]; } curr->ogString = &s; curr->cnt++; } TrieNode* getNode(const string& s) { auto curr = root; int size = (int)s.size(); for (int i = 0; i < size; i++) { int d = chrToHash[s[i]]; if (curr->children[d] == nullptr) return nullptr; curr = curr->children[d]; } return curr; } void process() { int timer = 0; trieNodes.reserve(n); root->depthFirstSearch(timer); } } trie; struct Eirt { TrieNode *root = new TrieNode; void insert(string& s, const int& index) { auto curr = root; curr->v.push_back(index); int size = (int)s.size(); for (int i = size - 1; i >= 0; i--) { int d = chrToHash[s[i]]; if (curr->children[d] == nullptr) curr->children[d] = new TrieNode; curr = curr->children[d]; curr->v.push_back(index); } curr->ogString = &s; } TrieNode* getNode(const string& s) { auto curr = root; int size = (int)s.size(); for (int i = size - 1; i >= 0; i--) { int d = chrToHash[s[i]]; if (curr->children[d] == nullptr) return nullptr; curr = curr->children[d]; } return curr; } } eirt; int main() { // freopen("inp.txt", "r", stdin); // freopen("out.txt", "w", stdout); ios::sync_with_stdio(false); chrToHash['A'] = 0; chrToHash['C'] = 1; chrToHash['G'] = 2; chrToHash['U'] = 3; cin >> n >> m; str.resize(n); for (int i = 0; i < n; i++) { cin >> str[i]; trie.insert(str[i]); } trie.process(); for (int i = 0; i < n; i++) eirt.insert(*trieNodes[i]->ogString, i); results.resize(m); string pref, suff; for (int q = 0; q < m; q++) { cin >> pref >> suff; auto itr = trie.getNode(pref); auto jtr = eirt.getNode(suff); if (itr == nullptr || jtr == nullptr) { results[q] = 0; continue; } auto l = lower_bound(jtr->v.begin(), jtr->v.end(), itr->l); auto r = lower_bound(jtr->v.begin(), jtr->v.end(), itr->r); results[q] = r - l; } for (auto &result : results) cout << result << '\n'; }

Compilation message (stderr)

selling_rna.cpp: In member function 'void Trie::insert(std::string&)':
selling_rna.cpp:47:35: warning: array subscript has type 'char' [-Wchar-subscripts]
   47 |             int d = chrToHash[s[i]];
      |                                   ^
selling_rna.cpp: In member function 'TrieNode* Trie::getNode(const string&)':
selling_rna.cpp:62:35: warning: array subscript has type 'char' [-Wchar-subscripts]
   62 |             int d = chrToHash[s[i]];
      |                                   ^
selling_rna.cpp: In member function 'void Eirt::insert(std::string&, const int&)':
selling_rna.cpp:89:35: warning: array subscript has type 'char' [-Wchar-subscripts]
   89 |             int d = chrToHash[s[i]];
      |                                   ^
selling_rna.cpp: In member function 'TrieNode* Eirt::getNode(const string&)':
selling_rna.cpp:104:35: warning: array subscript has type 'char' [-Wchar-subscripts]
  104 |             int d = chrToHash[s[i]];
      |                                   ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...