Submission #1064948

#TimeUsernameProblemLanguageResultExecution timeMemory
1064948YassirSalamaSelling RNA Strands (JOI16_selling_rna)C++17
100 / 100
274 ms197836 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(v) v.begin(),v.end()
#define F first
#define S second
#define pb push_back
int get(char c){
    if(c=='A') return 0;
    if(c=='G') return 1;
    if(c=='C') return 2;
    if(c=='U') return 3;
    return 5;
}
struct Trie1{
    struct Node{
        Node* c[4];
        int l=1e18;
        int r=-1e18;
        Node() {
            for(int i=0;i<4;i++) c[i]=nullptr;
        }
    };
    Node* root=new Node();
    void insert(string s,int id){
        int n=s.length();
        Node* node=root;
        for(int i=0;i<n;i++){
            if(node->c[get(s[i])]==nullptr){
                node->c[get(s[i])]=new Node();
            }
            node=node->c[get(s[i])];
            node->l=min(node->l,id); 
            node->r=max(node->r,id);
        }
    }
    pair<int,int> query(string s){
        int n=s.length();
        Node* node=root;
        for(int i=0;i<n;i++){
            if(node->c[get(s[i])]==nullptr) return {-1,-1};
            node=node->c[get(s[i])];
        }
        return {node->l,node->r};
    }
};
struct Trie2{
    struct Node{
        Node* c[4];
        vector<int> ids;
        Node() {
            for(int i=0;i<4;i++) c[i]=nullptr;
        }
    };
    Node* root=new Node();
    void insert(string s,int id){
        int n=s.length();
        Node* node=root;
        for(int i=n-1;i>=0;i--){
            if(node->c[get(s[i])]==nullptr){
                node->c[get(s[i])]=new Node();
            }
            node=node->c[get(s[i])];
            node->ids.push_back(id);
        }
    }
    int query(string s,pair<int,int> lf){
        int n=s.length();
        int ans=0;
        Node* node=root;
        for(int i=s.length()-1;i>=0;i--){
            if(node->c[get(s[i])]==nullptr) return 0;
            node=node->c[get(s[i])];
        }
        int l=lower_bound(all(node->ids),lf.F)-node->ids.begin();
        int r=upper_bound(all(node->ids),lf.S)-node->ids.begin();
        return r-l;
    }
};

signed main(){
    int n;
    cin>>n;
    int m;
    cin>>m;
    vector<string> s;
    for(int i=0;i<n;i++){
        string t;
        cin>>t;
        s.pb(t);
    }
    sort(all(s));
    Trie1 t1;
    Trie2 t2;
    for(int i=0;i<n;i++){
        t1.insert(s[i],i);
        t2.insert(s[i],i);
    }
    for(int i=0;i<m;i++){
        string a,b;
        cin>>a>>b;
        pair<int,int> aa=t1.query(a);
        cout<<t2.query(b,aa)<<endl;
    }
}

Compilation message (stderr)

selling_rna.cpp: In member function 'long long int Trie2::query(std::string, std::pair<long long int, long long int>)':
selling_rna.cpp:68:13: warning: unused variable 'n' [-Wunused-variable]
   68 |         int n=s.length();
      |             ^
selling_rna.cpp:69:13: warning: unused variable 'ans' [-Wunused-variable]
   69 |         int ans=0;
      |             ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...