Submission #1106947

#TimeUsernameProblemLanguageResultExecution timeMemory
1106947zNatsumiSelling RNA Strands (JOI16_selling_rna)C++17
100 / 100
239 ms193612 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> ii; const int N = 1e5 + 5, INF = 1e9; int n, m; string s[N]; int id(char x){ if(x == 'A') return 0; if(x == 'C') return 1; if(x == 'G') return 2; if(x == 'U') return 3; } struct Trie1{ struct node{ node* child[4]; int l, r; node(): l(INF), r(-INF) { child[0] = child[1] = child[2] = child[3] = NULL; } }; node* root; Trie1(): root(new node()){} void add(string &s, int idx){ auto p = root; for(auto ch : s){ int c = id(ch); if(!p->child[c]) p->child[c] = new node(); p = p->child[c]; p->l = min(p->l, idx); p->r = max(p->r, idx); } } ii query(string &s){ auto p = root; for(auto ch : s){ int c = id(ch); if(!p->child[c]) return {-1, -1}; p = p->child[c]; } return {p->l, p->r}; } } d1; struct Trie2{ struct node{ node* child[4]; vector<int> pos; node(){ child[0] = child[1] = child[2] = child[3] = NULL; } }; node* root; Trie2(): root(new node()) {} void add(string &s, int idx){ auto p = root; for(auto ch : s){ int c = id(ch); if(!p->child[c]) p->child[c] = new node(); p = p->child[c]; p->pos.push_back(idx); } } int query(string &s, int l, int r){ auto p = root; for(auto ch : s){ int c = id(ch); if(!p->child[c]) return 0; p = p->child[c]; } int tl = lower_bound(p->pos.begin(), p->pos.end(), l) - p->pos.begin(), tr = upper_bound(p->pos.begin(), p->pos.end(), r) - p->pos.begin() - 1; return tr - tl + 1; } } d2; int32_t main(){ cin.tie(0)->sync_with_stdio(0); // #define task "test" // if(fopen(task ".inp", "r")){ // freopen(task ".inp", "r", stdin); // freopen(task ".out", "w", stdout); // } cin >> n >> m; for(int i = 1; i <= n; i++) cin >> s[i]; sort(s + 1, s + n + 1); for(int i = 1; i <= n; i++){ d1.add(s[i], i); reverse(s[i].begin(), s[i].end()); d2.add(s[i], i); } while(m--){ string p, q; cin >> p >> q; reverse(q.begin(), q.end()); auto range = d1.query(p); if(range == make_pair(-1, -1)) cout << 0 << "\n"; else{ cout << d2.query(q, range.first, range.second) << "\n"; } } return 0; }

Compilation message (stderr)

selling_rna.cpp: In function 'int id(char)':
selling_rna.cpp:18:1: warning: control reaches end of non-void function [-Wreturn-type]
   18 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...