제출 #1267640

#제출 시각아이디문제언어결과실행 시간메모리
1267640tritranminh2808Selling RNA Strands (JOI16_selling_rna)C++20
100 / 100
193 ms193640 KiB
#include <bits/stdc++.h>
using namespace std;
struct node1{
    node1 *child[4];
    int l,r;
    node1(){
        for(int i=0;i<4;i++) child[i]=NULL;
        l=INT_MAX,r=-1;
    }
};
struct node2{
    node2 *child[4];
    vector <int> pos;
    node2(){
        for(int i=0;i<4;i++) child[i]=NULL;
    }
};
node1 trie1;
node2 trie2;
int cha(char c){
    if(c=='A') return 0;
    if(c=='G') return 1;
    if(c=='C') return 2;
    return 3;
}
void update1(string &s, node1 &root,int id){
    node1 *cur=&root;
    for(auto i:s){
        int c=cha(i);
        if(!cur->child[c]) cur->child[c]=new node1();
        cur=cur->child[c];
        cur->l=min(cur->l,id);
        cur->r=max(cur->r,id);
    }
}   
void update2(string &s, node2 &root,int id){
    node2 *cur=&root;
    for(auto i:s){
        int c=cha(i);
        if(!cur->child[c]) cur->child[c]=new node2();
        cur=cur->child[c];
        cur->pos.push_back(id);
    }
}   
pair <int, int > find1(string &s, node1 &root){
    node1 *cur=&root;
    for(auto i:s){
        int c=cha(i);
        if(!cur->child[c]) return {-1,-1};
        cur=cur->child[c];
    }
    return {cur->l,cur->r};
}
vector <int>  find2(string &s, node2 &root){
    node2 *cur=&root;
    for(auto i:s){
        int c=cha(i);
        if(!cur->child[c]) return {};
        cur=cur->child[c];
    }
    return cur->pos;
}
string a[200005];
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n,m;cin>> n >> m;
    for(int i=1;i<=n;i++) cin >> a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++) update1(a[i],trie1,i);
    for(int i=1;i<=n;i++){
        string x=a[i];
        reverse(x.begin(),x.end());
        update2(x,trie2,i);
    }
    while(m--){
        string p,q; cin >> p >> q;
        auto x=find1(p,trie1);
        if(x.first==-1){
            cout << "0\n";
            continue;
        }
        reverse (q.begin(),q.end());
        vector <int> v=find2(q,trie2);
        if(v.empty()) {
            cout << "0\n";
            continue;
        }
        cout << upper_bound(v.begin(),v.end(),x.second)-lower_bound(v.begin(),v.end(),x.first) << "\n";
    }
    return 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...