Submission #243942

#TimeUsernameProblemLanguageResultExecution timeMemory
243942fedoseevtimofeySelling RNA Strands (JOI16_selling_rna)C++14
100 / 100
162 ms79512 KiB
#include <iostream> #include <string> #include <vector> #include <queue> #include <deque> #include <stack> #include <set> #include <map> #include <unordered_map> #include <unordered_set> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <random> #include <iomanip> #include <functional> #include <cassert> using namespace std; typedef long long ll; const int L = 4e6 + 7; string rev(string s) { reverse(s.begin(), s.end()); return s; } int get_id(char c) { if (c == 'A') { return 0; } else if (c == 'G') { return 1; } else if (c == 'C') { return 2; } else { return 3; } } int go[L][4]; int l[L], r[L]; int uk = 2; int add(string s, int rt) { int v = rt; for (char c : s) { int id = get_id(c); if (go[v][id] == 0) { go[v][id] = uk++; } v = go[v][id]; } return v; } int find_string(string s, int rt) { int v = rt; for (char c : s) { int id = get_id(c); if (go[v][id] == 0) return -1; v = go[v][id]; } return v; } vector <int> e; void dfs(int u) { e.push_back(u); l[u] = (int)e.size() - 1; for (int i = 0; i < 4; ++i) { if (go[u][i] != 0) { dfs(go[u][i]); } } r[u] = (int)e.size() - 1; } struct Fenwick { vector <int> f; int n; Fenwick(int nn) { n = nn; f.resize(n); } void modify(int i, int val) { for (; i < n; i |= i + 1) { f[i] += val; } } int get(int r) { int res = 0; for (; r >= 0; r &= r + 1, --r) { res += f[r]; } return res; } int sum(int l, int r) { return get(r) - get(l - 1); } }; struct Event { int x, l, r, tp, id; Event(int x, int l, int r, int tp, int id) : x(x), l(l), r(r), tp(tp), id(id) {} bool operator <(const Event &other) const { if (x != other.x) return x < other.x; return id < other.id; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(0); #ifdef LOCAL freopen("input.txt", "r", stdin); #endif int n, m; cin >> n >> m; int rt1 = 0, rt2 = 1; vector <vector <int>> where(2, vector <int> (n)); for (int i = 0; i < n; ++i) { string s; cin >> s; where[0][i] = add(s, rt1); where[1][i] = add(rev(s), rt2); } dfs(rt1); e.clear(); dfs(rt2); vector <Event> events; for (int i = 0; i < n; ++i) { events.emplace_back(l[where[0][i]], l[where[1][i]], -1, -1, -1); } vector <int> ans(m); for (int i = 0; i < m; ++i) { string p, q; cin >> p >> q; q = rev(q); int s1 = find_string(p, rt1), s2 = find_string(q, rt2); if (s1 == -1 || s2 == -1) { continue; } events.emplace_back(r[s1], l[s2], r[s2], 1, i); events.emplace_back(l[s1] - 1, l[s2], r[s2], -1, i); } sort(events.begin(), events.end()); Fenwick F(L); for (auto e : events) { if (e.id == -1) { F.modify(e.l, 1); } else { ans[e.id] += e.tp * F.sum(e.l, e.r); } } for (int i = 0; i < m; ++i) { cout << ans[i] << '\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...