Submission #1079192

#TimeUsernameProblemLanguageResultExecution timeMemory
1079192AndreySelling RNA Strands (JOI16_selling_rna)C++14
100 / 100
1346 ms962924 KiB
#include<bits/stdc++.h> using namespace std; vector<vector<int>> trie[2000001]; vector<int> sb[2000001]; vector<int> yo[2000001]; vector<int> idk[2000001]; vector<int> lol[2000001]; vector<string> haha(2000001); vector<pair<string,string>> query(2000001); vector<int> ans(2000001); 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) { if(!no) { return; } 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 < wut.size(); i++) { trie[wut[i].second].clear(); lol[wut[i].second].clear(); sb[wut[i].second].clear(); } } 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 <= 2000000; 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] << "\n"; } return 0; }

Compilation message (stderr)

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:59:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |     if(d == s.size()) {
      |        ~~^~~~~~~~~~~
selling_rna.cpp: In function 'void dfs(int, int)':
selling_rna.cpp:80: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]
   80 |         for(int i = 1; i < wut.size(); i++) {
      |                        ~~^~~~~~~~~~~~
selling_rna.cpp:88: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]
   88 |         for(int i = 0; i < wut.size(); i++) {
      |                        ~~^~~~~~~~~~~~
selling_rna.cpp:94:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |     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 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...