#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 '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 |
1 ms |
332 KB |
Output is correct |
2 |
Correct |
1 ms |
332 KB |
Output is correct |
3 |
Correct |
1 ms |
460 KB |
Output is correct |
4 |
Correct |
1 ms |
332 KB |
Output is correct |
5 |
Correct |
1 ms |
332 KB |
Output is correct |
6 |
Correct |
1 ms |
332 KB |
Output is correct |
7 |
Correct |
1 ms |
332 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
767 ms |
533432 KB |
Output is correct |
2 |
Correct |
761 ms |
524756 KB |
Output is correct |
3 |
Correct |
730 ms |
524908 KB |
Output is correct |
4 |
Correct |
712 ms |
524864 KB |
Output is correct |
5 |
Correct |
1221 ms |
782188 KB |
Output is correct |
6 |
Correct |
1150 ms |
782048 KB |
Output is correct |
7 |
Correct |
90 ms |
34280 KB |
Output is correct |
8 |
Correct |
725 ms |
456252 KB |
Output is correct |
9 |
Correct |
641 ms |
443580 KB |
Output is correct |
10 |
Correct |
583 ms |
419308 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
31 ms |
4052 KB |
Output is correct |
2 |
Correct |
25 ms |
5004 KB |
Output is correct |
3 |
Correct |
32 ms |
4316 KB |
Output is correct |
4 |
Correct |
22 ms |
3376 KB |
Output is correct |
5 |
Correct |
27 ms |
4620 KB |
Output is correct |
6 |
Correct |
32 ms |
4704 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
332 KB |
Output is correct |
2 |
Correct |
1 ms |
332 KB |
Output is correct |
3 |
Correct |
1 ms |
460 KB |
Output is correct |
4 |
Correct |
1 ms |
332 KB |
Output is correct |
5 |
Correct |
1 ms |
332 KB |
Output is correct |
6 |
Correct |
1 ms |
332 KB |
Output is correct |
7 |
Correct |
1 ms |
332 KB |
Output is correct |
8 |
Correct |
767 ms |
533432 KB |
Output is correct |
9 |
Correct |
761 ms |
524756 KB |
Output is correct |
10 |
Correct |
730 ms |
524908 KB |
Output is correct |
11 |
Correct |
712 ms |
524864 KB |
Output is correct |
12 |
Correct |
1221 ms |
782188 KB |
Output is correct |
13 |
Correct |
1150 ms |
782048 KB |
Output is correct |
14 |
Correct |
90 ms |
34280 KB |
Output is correct |
15 |
Correct |
725 ms |
456252 KB |
Output is correct |
16 |
Correct |
641 ms |
443580 KB |
Output is correct |
17 |
Correct |
583 ms |
419308 KB |
Output is correct |
18 |
Correct |
31 ms |
4052 KB |
Output is correct |
19 |
Correct |
25 ms |
5004 KB |
Output is correct |
20 |
Correct |
32 ms |
4316 KB |
Output is correct |
21 |
Correct |
22 ms |
3376 KB |
Output is correct |
22 |
Correct |
27 ms |
4620 KB |
Output is correct |
23 |
Correct |
32 ms |
4704 KB |
Output is correct |
24 |
Correct |
714 ms |
526512 KB |
Output is correct |
25 |
Correct |
712 ms |
526520 KB |
Output is correct |
26 |
Correct |
706 ms |
526480 KB |
Output is correct |
27 |
Correct |
681 ms |
527284 KB |
Output is correct |
28 |
Correct |
293 ms |
96652 KB |
Output is correct |
29 |
Correct |
105 ms |
22408 KB |
Output is correct |