#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> trie[100001];
vector<int> sb[100001];
vector<int> yo[100001];
vector<int> idk[100001];
vector<int> lol[100001];
vector<string> haha(100001);
vector<pair<string,string>> query(100001);
vector<int> ans(100001);
int wow(char a) {
if(a == 'A') {
return 0;
}
if(a == 'G') {
return 1;
}
if(a == 'C') {
return 2;
}
if(a == 'U') {
return 3;
}
}
void ins(int p, int x, string& s, int d, int br, bool no) {
if(d >= s.size()) {
if(br != -1) {
if(no) {
yo[x].push_back(br);
}
else {
idk[x].push_back(br);
}
}
sb[p][x]++;
return;
}
int c = wow(s[d]);
if(trie[p][x][c] == -1) {
trie[p][x][c] = trie[p].size();
trie[p].push_back({-1,-1,-1,-1});
sb[p].push_back(0);
}
sb[p][x]-=sb[p][trie[p][x][c]];
ins(p,trie[p][x][c],s,d+1,br,no);
sb[p][x]+=sb[p][trie[p][x][c]];
}
int calc(int p, int x, int d, string& s) {
if(x == -1) {
return 0;
}
if(d == s.size()) {
return sb[p][x];
}
int c = wow(s[d]);
return calc(p,trie[p][x][c],d+1,s);
}
void dfs(int x, int d) {
vector<pair<int,int>> wut(0);
for(int i = 0; i < 4; i++) {
if(trie[0][x][i] != -1) {
dfs(trie[0][x][i],d+1);
wut.push_back({trie[trie[0][x][i]].size(),trie[0][x][i]});
}
}
sort(wut.begin(),wut.end());
reverse(wut.begin(),wut.end());
if(wut.size() > 0) {
swap(trie[x],trie[wut[0].second]);
swap(lol[x],lol[wut[0].second]);
swap(sb[x],sb[wut[0].second]);
for(int i = 1; i < wut.size(); i++) {
for(int v: lol[wut[i].second]) {
reverse(haha[v].begin(),haha[v].end());
ins(x,0,haha[v],0,-1,1);
reverse(haha[v].begin(),haha[v].end());
lol[x].push_back(v);
}
}
}
for(int i = 0; i < yo[x].size(); i++) {
int v = yo[x][i];
reverse(haha[v].begin(),haha[v].end());
ins(x,0,haha[v],0,-1,1);
reverse(haha[v].begin(),haha[v].end());
lol[x].push_back(yo[x][i]);
}
for(int v: idk[x]) {
ans[v] = calc(x,0,0,query[v].second);
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n,q;
cin >> n >> q;
string s,a,b;
for(int i = 0; i <= 100000; i++) {
trie[i].push_back({-1,-1,-1,-1});
sb[i].push_back(0);
}
trie[0].push_back({-1,-1,-1,-1});
sb[0].push_back(0);
for(int i = 0; i < n; i++) {
cin >> s;
haha[i] = s;
ins(0,1,s,0,i,1);
}
for(int i = 0; i < q; i++) {
cin >> a >> b;
reverse(b.begin(),b.end());
query[i] = {a,b};
ins(0,1,a,0,i,0);
}
dfs(1,0);
for(int i = 0; i < q; i++) {
cout << ans[i] << endl;
}
return 0;
}
Compilation message
selling_rna.cpp: In function 'void ins(int, int, std::string&, int, int, bool)':
selling_rna.cpp:29:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
29 | if(d >= s.size()) {
| ~~^~~~~~~~~~~
selling_rna.cpp: In function 'int calc(int, int, int, std::string&)':
selling_rna.cpp:56:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
56 | if(d == s.size()) {
| ~~^~~~~~~~~~~
selling_rna.cpp: In function 'void dfs(int, int)':
selling_rna.cpp:77:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
77 | for(int i = 1; i < wut.size(); i++) {
| ~~^~~~~~~~~~~~
selling_rna.cpp:86:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
86 | for(int i = 0; i < yo[x].size(); i++) {
| ~~^~~~~~~~~~~~~~
selling_rna.cpp: In function 'int wow(char)':
selling_rna.cpp:26:1: warning: control reaches end of non-void function [-Wreturn-type]
26 | }
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
20 ms |
31324 KB |
Output is correct |
2 |
Correct |
21 ms |
31364 KB |
Output is correct |
3 |
Correct |
20 ms |
31216 KB |
Output is correct |
4 |
Correct |
20 ms |
31320 KB |
Output is correct |
5 |
Correct |
21 ms |
31324 KB |
Output is correct |
6 |
Correct |
22 ms |
31212 KB |
Output is correct |
7 |
Correct |
24 ms |
31388 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
377 ms |
267800 KB |
Output is correct |
2 |
Correct |
396 ms |
269204 KB |
Output is correct |
3 |
Runtime error |
83 ms |
101096 KB |
Execution killed with signal 11 |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
85 ms |
32808 KB |
Output is correct |
2 |
Correct |
65 ms |
33696 KB |
Output is correct |
3 |
Correct |
78 ms |
33468 KB |
Output is correct |
4 |
Correct |
65 ms |
32592 KB |
Output is correct |
5 |
Correct |
75 ms |
33628 KB |
Output is correct |
6 |
Correct |
77 ms |
33488 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
20 ms |
31324 KB |
Output is correct |
2 |
Correct |
21 ms |
31364 KB |
Output is correct |
3 |
Correct |
20 ms |
31216 KB |
Output is correct |
4 |
Correct |
20 ms |
31320 KB |
Output is correct |
5 |
Correct |
21 ms |
31324 KB |
Output is correct |
6 |
Correct |
22 ms |
31212 KB |
Output is correct |
7 |
Correct |
24 ms |
31388 KB |
Output is correct |
8 |
Correct |
377 ms |
267800 KB |
Output is correct |
9 |
Correct |
396 ms |
269204 KB |
Output is correct |
10 |
Runtime error |
83 ms |
101096 KB |
Execution killed with signal 11 |
11 |
Halted |
0 ms |
0 KB |
- |