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