Submission #1276499

#TimeUsernameProblemLanguageResultExecution timeMemory
1276499papauloSelling RNA Strands (JOI16_selling_rna)C++20
100 / 100
329 ms280324 KiB
#include <bits/stdc++.h> using namespace std; #define MAXI 2100100 #define MAXM 100100 int trie[MAXI][4]; int mp[256]; vector<string> strs[MAXI]; int ans[MAXM]; int cnt[MAXI]; int sti[MAXI]; vector<int> trie2[MAXI][4]; vector<int> cnt2[MAXI]; vector<pair<int, string>> qs[MAXI]; int id=0; void insert(string s) { int n=0; for(auto ch : s) { int &t=trie[n][mp[ch]]; if(!t) { t=++id; } n=t; cnt[n]++; } reverse(s.begin(), s.end()); strs[n].push_back(s); } void insert(int t, string s) { int n=0; for(auto ch : s) { int nxt=trie2[t][mp[ch]][n]; if(!nxt) { nxt=trie2[t][mp[ch]].size(); for(int i=0;i<4;i++) trie2[t][i].push_back(0); cnt2[t].push_back(0); trie2[t][mp[ch]][n]=nxt; } n=nxt; cnt2[t][n]++; } } int search(int t, string s) { int n=0; for(auto ch : s) { int nxt=trie2[t][mp[ch]][n]; if(!t) { return 0; } n=nxt; } return cnt2[t][n]; } void addQ(int i, string p, string q) { int n=0; for(auto ch : p) { int t=trie[n][mp[ch]]; if(!t) return; n=t; } reverse(q.begin(), q.end()); qs[n].push_back({i, q}); } void dfs(int v) { int bst=0; for(int i=0;i<4;i++) { int t=trie[v][i]; if(cnt[t]>cnt[bst]) bst=t; } if(!bst) { sti[v]=v; for(int i=0;i<4;i++) trie2[v][i].push_back(0); cnt2[v].push_back(0); for(auto s : strs[v]) insert(v, s); for(auto pr : qs[v]) { ans[pr.first]=search(v, pr.second); } return; } dfs(bst); sti[v]=sti[bst]; for(int i=0;i<4;i++) { int t=trie[v][i]; if(!t||t==bst) continue; dfs(t); for(int i=0;i<4;i++) trie2[sti[t]][i].clear(); cnt2[sti[t]].clear(); for(auto s : strs[sti[t]]) { insert(sti[v], s); strs[sti[v]].push_back(s); } strs[sti[t]].clear(); } for(auto s : strs[v]) { insert(sti[v], s); strs[sti[v]].push_back(s); } for(auto pr : qs[v]) { ans[pr.first]=search(sti[v], pr.second); } } int main() { memset(trie, 0, sizeof(trie)); memset(ans, 0, sizeof(ans)); cin.tie(nullptr); ios::sync_with_stdio(false); mp['A']=0, mp['G']=1, mp['C']=2, mp['U']=3; int n, m; cin >> n >> m; while(n--) { string s; cin >> s; insert(s); } for(int i=0;i<m;i++) { string p, q; cin >> p >> q; addQ(i, p, q); } dfs(0); for(int i=0;i<m;i++) cout << ans[i] << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...