답안 #668626

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
668626 2022-12-04T09:44:27 Z Shin Selling RNA Strands (JOI16_selling_rna) C++14
100 / 100
216 ms 159164 KB
#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
 
using namespace std;
template <class X, class Y> bool minimize(X &a, Y b) {
    if (a > b) return a = b, true;
    return false;
}
template <class X, class Y> bool maximize(X &a, Y b) {
    if (a < b) return a = b, true;
    return false;
}
 
struct fenwick_tree {
  vector<int> bit;
  int n;
  fenwick_tree(int _n) : n(_n) {
    bit.assign(n + 7, 0);
  }
  int get(int i) const {
    int res = 0;
    for (i ++, minimize(i, n); i > 0; i -= i & -i) res += bit[i];
    return res;
  }
  int get_range(int l, int r) const {
    if (r < l) return 0;
    return get(r) - get(l - 1);
  }
  
  void modify(int i, int v) {
    for (++ i; i <= n; i += i & -i) bit[i] += v;
  }
};
 
const char base[] = {'A', 'G', 'C', 'U'};
struct Trie {
  const static int M = 2e6 + 100;
  int node[M][4];
  int num_node;
  int ind[26];
  int cnt[M];
  int tin[M];
  int tout[M];
 
  auto & operator [](int i) { 
    return node[i]; 
  }
 
  const auto & operator [](int i) const { 
    return node[i]; 
  }
 
  Trie() {
    memset(node, 0, sizeof node);
    num_node = 0;
    for (int i = 0; i < 4; i ++) {
      ind[base[i] - 'A'] = i;
    }
  }
 
  int add(string &s) {
    int cur = 0;
    for (int i = 0; i < (int) s.size(); i ++) {
      int c = ind[s[i] - 'A'];
      if (node[cur][c] == 0) {
        node[cur][c] = ++ num_node;
      }
      cur = node[cur][c];
    }
    cnt[cur] ++;
    return cur;
  }
 
  int find_str(string &s) {
    int cur = 0;
    for (int i = 0; i < (int) s.size(); i ++) {
      int c = ind[s[i] - 'A'];
      if (node[cur][c] == 0) {
        return - 1;
      }
      cur = node[cur][c];
    }
    return cur;
  }
 
  void dfs_pre(int u = 0) {
    static int timer = 0;
    tin[u] = ++ timer;
    for (int i = 0; i < 4; i ++) if (node[u][i]) {
      dfs_pre(node[u][i]);
    }
    tout[u] = timer;
  }
} pref, suff;
 
const int N = 2e6 + 100;
int pos[N];
int res[N];
int rem[N];
vector<pair<int, int>> qr[N];
 
signed main() {
  cin.tie(0)->sync_with_stdio(0);
  int n, m; cin >> n >> m;
  for (int i = 1; i <= n; i ++) {
    string s; cin >> s;
    int u = pref.add(s);
    reverse(s.begin(), s.end());
    int v = suff.add(s);
    pos[u] = v;
  }
  pref.dfs_pre();
  suff.dfs_pre();
  for (int i = 1; i <= m; i ++) {
    string p, q; cin >> p >> q;
    reverse(q.begin(), q.end());
    int u = pref.find_str(p);
    int v = suff.find_str(q);
    if (u < 0 || v < 0) {
      continue;
    }
    qr[u].emplace_back(v, i);
  }
 
  fenwick_tree f(suff.num_node + N);
  function<void(int)> dfs = [&](int u) {
    for (auto [v, i]: qr[u]) {
      rem[i] = f.get_range(suff.tin[v], suff.tout[v]);
    }
    f.modify(suff.tin[pos[u]], pref.cnt[u]);
    for (int i = 0; i < 4; i ++) if (pref.node[u][i]) {
      dfs(pref.node[u][i]);
    }
    for (auto [v, i]: qr[u]) {
      res[i] = f.get_range(suff.tin[v], suff.tout[v]);
    }
  };
 
  dfs(0);
  for (int i = 1; i <= m; i ++) {
    cout << res[i] - rem[i] << '\n';
  }
  return 0;
}

Compilation message

selling_rna.cpp: In lambda function:
selling_rna.cpp:129:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  129 |     for (auto [v, i]: qr[u]) {
      |               ^
selling_rna.cpp:136:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  136 |     for (auto [v, i]: qr[u]) {
      |               ^
# 결과 실행 시간 메모리 Grader output
1 Correct 48 ms 117708 KB Output is correct
2 Correct 47 ms 117700 KB Output is correct
3 Correct 48 ms 117788 KB Output is correct
4 Correct 57 ms 117744 KB Output is correct
5 Correct 49 ms 117732 KB Output is correct
6 Correct 49 ms 117728 KB Output is correct
7 Correct 48 ms 117728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 132 ms 145976 KB Output is correct
2 Correct 129 ms 146620 KB Output is correct
3 Correct 216 ms 145124 KB Output is correct
4 Correct 197 ms 145756 KB Output is correct
5 Correct 197 ms 156132 KB Output is correct
6 Correct 210 ms 159164 KB Output is correct
7 Correct 82 ms 121592 KB Output is correct
8 Correct 138 ms 143708 KB Output is correct
9 Correct 134 ms 140196 KB Output is correct
10 Correct 116 ms 139596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 67 ms 119096 KB Output is correct
2 Correct 60 ms 118616 KB Output is correct
3 Correct 62 ms 118988 KB Output is correct
4 Correct 60 ms 118484 KB Output is correct
5 Correct 60 ms 118604 KB Output is correct
6 Correct 62 ms 118748 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 48 ms 117708 KB Output is correct
2 Correct 47 ms 117700 KB Output is correct
3 Correct 48 ms 117788 KB Output is correct
4 Correct 57 ms 117744 KB Output is correct
5 Correct 49 ms 117732 KB Output is correct
6 Correct 49 ms 117728 KB Output is correct
7 Correct 48 ms 117728 KB Output is correct
8 Correct 132 ms 145976 KB Output is correct
9 Correct 129 ms 146620 KB Output is correct
10 Correct 216 ms 145124 KB Output is correct
11 Correct 197 ms 145756 KB Output is correct
12 Correct 197 ms 156132 KB Output is correct
13 Correct 210 ms 159164 KB Output is correct
14 Correct 82 ms 121592 KB Output is correct
15 Correct 138 ms 143708 KB Output is correct
16 Correct 134 ms 140196 KB Output is correct
17 Correct 116 ms 139596 KB Output is correct
18 Correct 67 ms 119096 KB Output is correct
19 Correct 60 ms 118616 KB Output is correct
20 Correct 62 ms 118988 KB Output is correct
21 Correct 60 ms 118484 KB Output is correct
22 Correct 60 ms 118604 KB Output is correct
23 Correct 62 ms 118748 KB Output is correct
24 Correct 127 ms 147600 KB Output is correct
25 Correct 138 ms 148484 KB Output is correct
26 Correct 133 ms 146948 KB Output is correct
27 Correct 197 ms 147116 KB Output is correct
28 Correct 118 ms 128000 KB Output is correct
29 Correct 94 ms 123356 KB Output is correct