Submission #1218176

#TimeUsernameProblemLanguageResultExecution timeMemory
1218176bncodero_o123Selling RNA Strands (JOI16_selling_rna)C++20
100 / 100
248 ms198316 KiB
#include <bits/stdc++.h>
#define pii pair<int, int>
#define fi first
#define se second
#define name "code"
using namespace std;

const int max_n= 1e5;
string s[max_n + 2];

int get_val(char c) {
    if(c == 'A') return 0;
    if(c == 'C') return 1;
    if(c == 'G') return 2;
    return 3;
}

char get_char(int x) {
    if(x == 0) return 'A';
    if(x == 1) return 'C';
    if(x == 2) return 'G';
    return 'U';
}

struct TRIE {
    struct NODE {
        NODE* child[4];
        int l, r, exist;
        NODE() {
            for(int i= 0; i < 4; ++i) child[i]= NULL;
            l= max_n, r= -1, exist= 0;
        }
    }* root;

    TRIE() : root(new NODE()) {}

    void add(string s) {
        NODE* cur= root;
        for(char c : s) {
            int id= get_val(c);
            if(cur -> child[id] == NULL) cur -> child[id]= new NODE();
            cur= cur -> child[id];
        }
        ++cur -> exist;
    }

    void add(string s, int p) {
        NODE* cur= root;
        for(char c : s) {
            int id= get_val(c);
            cur= cur -> child[id];
            cur -> l= min(cur -> l, p);
            cur -> r= max(cur -> r, p);
        }
    }

    int idx;
    string str;
    void sort(NODE* cur) {
        if(cur == root) idx= 0, str= "";
        for(int i= 0; i < cur -> exist; ++i) s[idx++]= str;
        for(int i= 0; i < 4; ++i)
            if(cur -> child[i] != NULL) {
                str.push_back(get_char(i));
                sort(cur -> child[i]);
                str.pop_back();
            }
    }

    pii get(string s) {
        NODE* cur= root;
        for(char c : s) {
            int id= get_val(c);
            if(cur -> child[id] == NULL) return make_pair(-1, -1);
            cur= cur -> child[id];
        }
        return make_pair(cur -> l, cur -> r);
    }
} trie;

struct REV_TRIE {
    struct NODE {
        NODE* child[4];
        vector<int> idx;
        NODE() {
            for(int i= 0; i < 4; ++i) child[i]= NULL;
        }
    }* root;

    REV_TRIE() : root(new NODE()) {}

    void add(string s, int p) {
        NODE* cur= root;
        reverse(s.begin(), s.end());
        for(int c : s) {
            int id= get_val(c);
            if(cur -> child[id] == NULL) cur -> child[id]= new NODE();
            cur= cur -> child[id];
            (cur -> idx).push_back(p);
        }
    }

    void build(NODE* cur) {
        if((cur -> idx).size()) sort((cur -> idx).begin(), (cur -> idx).end());
        for(int i= 0; i < 4; ++i) {
            if(cur -> child[i] != NULL) build(cur -> child[i]);
        }
    }

    int get(int l, int r, string s) {
        if(l == -1) return 0;
        NODE* cur= root;
        reverse(s.begin(), s.end());
        for(char c : s) {
            int id= get_val(c);
            if(cur -> child[id] == NULL) return 0;
            cur= cur -> child[id];
        }

        int g= lower_bound((cur -> idx).begin(), (cur -> idx).end(), l) - (cur -> idx).begin();
        int h= upper_bound((cur -> idx).begin(), (cur -> idx).end(), r) - (cur -> idx).begin();
        return h - g;
    }
} rev_trie;

void solve() {
    int n, q; cin >> n >> q;
    for(int i= 0; i < n; ++i) {
        string t; cin >> t;
        trie.add(t);
    }

    trie.sort(trie.root);
    for(int i= 0; i < n; ++i) trie.add(s[i], i);
    for(int i= 0; i < n; ++i) rev_trie.add(s[i], i);
    rev_trie.build(rev_trie.root);

    for(int i= 0; i < q; ++i) {
        string p, q; cin >> p >> q;
        auto [l, r]= trie.get(p);
        cout << rev_trie.get(l, r, q) << '\n';
    }
}

signed main() {
    ios_base:: sync_with_stdio(false);
    cin.tie(NULL);
    if(fopen(name".inp", "r")) {
        freopen(name".inp", "r", stdin);
        freopen(name".out", "w", stdout);
    }

    int T= 1;
    for(; T > 0; --T) solve();

    return 0;
}

Compilation message (stderr)

selling_rna.cpp: In function 'int main()':
selling_rna.cpp:149:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  149 |         freopen(name".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
selling_rna.cpp:150:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  150 |         freopen(name".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...