#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 |