제출 #1343609

#제출 시각아이디문제언어결과실행 시간메모리
1343609khanhphucscratchSelling RNA Strands (JOI16_selling_rna)C++20
0 / 100
140 ms139636 KiB
#include<bits/stdc++.h>
using namespace std;
vector<int> st[2000005];
int trie[2][2000005][4], num[2000005], sz[2];
void add(int b, string s, int idx)
{
    if(b == 1){
        reverse(s.begin(), s.end());
    }
    int u = 0;
    for(int i = 0; i < s.size(); i++){
        if(trie[b][u][s[i] - 'A'] == 0) trie[b][u][s[i] - 'A'] = ++sz[b];
        u = trie[b][u][s[i] - 'A'];
        if(b == 0) num[u]++;
        else st[u].push_back(idx);
    }
}
string curstr = "";
int cc = 0;
void dfs(int u)
{
    //On trie 0 only
    int curnum = num[u];
    for(int i = 0; i < 4; i++) curnum -= num[trie[0][u][i]];
    if(curstr.size() > 0) while(curnum--) add(1, curstr, ++cc);
    for(int i = 0; i < 4; i++){
        curstr.push_back(i + 'A');
        if(trie[0][u][i] > 0) dfs(trie[0][u][i]);
        curstr.pop_back();
    }
}
pair<int, int> get_range(string s)
{
    int pref = 0, u = 0;
    for(int i = 0; i < s.size(); i++){
        for(int j = 0; j < s[i] - 'A'; j++) pref += num[trie[0][u][j]];
        u = trie[0][u][s[i] - 'A'];
        if(u == 0) return {-1, -1};
    }
    return make_pair(pref+1, pref + num[u]);
}
string format(string s)
{
    //Format to ABCD
    for(auto &i : s){
        if(i == 'A') i = 'A';
        else if(i == 'C') i = 'B';
        else if(i == 'G') i = 'C';
        else i = 'D';
    }
    return s;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, q; cin>>n>>q;
    for(int i = 1; i <= n; i++){
        string s; cin>>s;
        add(0, format(s), -1);
    }
    dfs(0);
    //Now solve
    for(int test = 0; test < q; test++){
        string pref, suf; cin>>pref>>suf;
        pref = format(pref); suf = format(suf);
        pair<int, int> range = get_range(pref);
        int u = 0;
        for(int i = 0; i < suf.size(); i++){
            u = trie[1][u][suf[i] - 'A'];
            if(u == 0) break;
        }
        int ans = upper_bound(st[u].begin(), st[u].end(), range.second) - lower_bound(st[u].begin(), st[u].end(), range.first);
        cout<<ans<<'\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...