답안 #1034349

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1034349 2024-07-25T12:32:19 Z doducanh Selling RNA Strands (JOI16_selling_rna) C++14
100 / 100
876 ms 783632 KB
#include <bits/stdc++.h>
 
using namespace std;
 
#define int int64_t //be careful about this 
#define endl "\n"
#define f(i, a, b) for (int i = int(a); i < int(b); ++i)
 
#define pr pair
#define ar array
#define fr first
#define sc second
#define vt vector
#define pb push_back
#define eb emplace_back
 
#define SZ(x) ((int)(x).size())
#define all(a) (a).begin(), (a).end()
#define allr(a) (a).rbegin(), (a).rend()
#define mem(a, b) memset(a, b, sizeof(a))
 
void setIO(string s = "") {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  // remove this when size of input is not fixed.
  cin.exceptions(cin.failbit);
  cout.precision(15);
  cout << fixed;
  if (SZ(s)) {
    freopen((s + ".in").c_str(), "r", stdin);
    freopen((s + ".out").c_str(), "w", stdout);
  }
}
 
template<const int ALPHABET>
struct prefix_tree {
 
  struct trie_node {
    int link[ALPHABET];
    vector<int> who;
 
    trie_node() {
      memset(link, -1, sizeof(link));
    }
  };
 
  vector<trie_node> trie;
 
  prefix_tree() {
    trie.emplace_back();
  }
 
  void create_node(int parent, int c) {
    trie.emplace_back();
  }
 
  int get_or_create_node(int current, int c) {
    if (trie[current].link[c] < 0) {
      trie[current].link[c] = trie.size();
      create_node(current, c);
    }
 
    return trie[current].link[c];
  }
 
  int insert_str(const string & str, const int & i) {
    int current = 0;
    for (char c: str) {
      current = get_or_create_node(current, c - 'A');
      trie[current].who.push_back(i);
    }
    return current;
  }
 
  ar<int,2> query(const string & str) {
    int current = 0;
    for (char c: str) {
      if (trie[current].link[c - 'A'] < 0) return ar<int,2> {-1,-1};
      current = trie[current].link[c - 'A'];
    }
    return ar<int,2> {trie[current].who.front(),trie[current].who.back()};
  }
 
  int query(const string & str, int L, int R) {
    int current = 0;
    for (char c: str) {
      if (trie[current].link[c - 'A'] < 0) return int(0);
      current = trie[current].link[c - 'A'];
    }
    return int(upper_bound(all(trie[current].who), R) - lower_bound(all(trie[current].who), L));
  }
};
 
prefix_tree<26> trie, reverse_trie;
 
signed main() {
  setIO();
  int n, q;
  cin >> n >> q;
  vt<string> s(n);
  for (auto & _s: s) cin >> _s;
  sort(all(s));
 
  f(i, 0, n) {
    trie.insert_str(s[i], i);
    reverse(all(s[i]));
    reverse_trie.insert_str(s[i], i);
  }
 
  while (q--) {
    string p, q;
    cin >> p >> q;
    auto [L, R] = trie.query(p);
    reverse(all(q));
    cout << reverse_trie.query(q, L, R) << endl;
  }
 
}

Compilation message

selling_rna.cpp: In function 'int main()':
selling_rna.cpp:114:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  114 |     auto [L, R] = trie.query(p);
      |          ^
selling_rna.cpp: In function 'void setIO(std::string)':
selling_rna.cpp:31:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   31 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
selling_rna.cpp:32:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   32 |     freopen((s + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 604 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 499 ms 537664 KB Output is correct
2 Correct 501 ms 526916 KB Output is correct
3 Correct 449 ms 528964 KB Output is correct
4 Correct 433 ms 526964 KB Output is correct
5 Correct 780 ms 783632 KB Output is correct
6 Correct 876 ms 783460 KB Output is correct
7 Correct 70 ms 39756 KB Output is correct
8 Correct 501 ms 458588 KB Output is correct
9 Correct 435 ms 445904 KB Output is correct
10 Correct 432 ms 421644 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 4620 KB Output is correct
2 Correct 14 ms 5532 KB Output is correct
3 Correct 27 ms 4840 KB Output is correct
4 Correct 14 ms 3920 KB Output is correct
5 Correct 22 ms 5020 KB Output is correct
6 Correct 18 ms 5232 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 604 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 499 ms 537664 KB Output is correct
9 Correct 501 ms 526916 KB Output is correct
10 Correct 449 ms 528964 KB Output is correct
11 Correct 433 ms 526964 KB Output is correct
12 Correct 780 ms 783632 KB Output is correct
13 Correct 876 ms 783460 KB Output is correct
14 Correct 70 ms 39756 KB Output is correct
15 Correct 501 ms 458588 KB Output is correct
16 Correct 435 ms 445904 KB Output is correct
17 Correct 432 ms 421644 KB Output is correct
18 Correct 17 ms 4620 KB Output is correct
19 Correct 14 ms 5532 KB Output is correct
20 Correct 27 ms 4840 KB Output is correct
21 Correct 14 ms 3920 KB Output is correct
22 Correct 22 ms 5020 KB Output is correct
23 Correct 18 ms 5232 KB Output is correct
24 Correct 443 ms 528816 KB Output is correct
25 Correct 455 ms 528684 KB Output is correct
26 Correct 504 ms 528672 KB Output is correct
27 Correct 438 ms 529476 KB Output is correct
28 Correct 177 ms 101164 KB Output is correct
29 Correct 58 ms 25808 KB Output is correct