제출 #1263997

#제출 시각아이디문제언어결과실행 시간메모리
1263997hahaSelling RNA Strands (JOI16_selling_rna)C++20
100 / 100
196 ms251684 KiB
#include <bits/stdc++.h>
#define ll long long
#define f first
#define s second
using namespace std;
const int maxn=2e6+5;
const int base=31;
const ll MOD=1e9+7;

int n,m,cur=0,cur1=0;
vector<string> S;
// ACGU
char a[]={'A','C','G','U'};

struct Node
{
    int child[4];
    int l,r;
    vector<int> id;
};
Node nodes[maxn],nodes1[maxn];

int new_node()
{
    cur++;
    memset(nodes[cur].child,-1,sizeof(nodes[cur].child));
    return cur;
}

int new_node1()
{
    cur1++;
    memset(nodes1[cur1].child,-1,sizeof(nodes1[cur1].child));
    return cur1;
}

void add_string(string s,int idx)
{
    int pos=0;
    for(int i=0;i<s.size();i++){
        int c=0;
        for(int x=0;x<4;x++){
            if(s[i]==a[x]) c=x;
        }
        if(nodes[pos].child[c]==-1){
            nodes[pos].child[c]=new_node();
        }
        pos=nodes[pos].child[c];
        if(nodes[pos].l==0) nodes[pos].l=idx;
        nodes[pos].r=idx;
    }
}

void add_string1(string s,int idx)
{
    int pos=0;
    for(int i=0;i<s.size();i++){
        int c=0;
        for(int x=0;x<4;x++){
            if(s[i]==a[x]) c=x;
        }
        if(nodes1[pos].child[c]==-1){
            nodes1[pos].child[c]=new_node1();
        }
        pos=nodes1[pos].child[c];
        nodes1[pos].id.push_back(idx);
    }
}

int main()
{
    
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    memset(nodes[0].child,-1,sizeof(nodes[0].child));
    memset(nodes1[0].child,-1,sizeof(nodes1[0].child));
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        string x;
        cin>>x;
        S.push_back(x);
    }
    sort(S.begin(),S.end());
    for(int i=0;i<S.size();i++){
        add_string(S[i],i+1);
        reverse(S[i].begin(),S[i].end());
        add_string1(S[i],i+1);
    }
    while(m--){
        string p,q;
        cin>>p>>q;
        int pos=0,ans=0;
        bool check=true;
        for(int i=0;i<p.size();i++){
            int c=0;
            for(int x=0;x<4;x++){
                if(p[i]==a[x]) c=x;
            }
            if(nodes[pos].child[c]==-1){
                check=false;
                break;
            }
            pos=nodes[pos].child[c];
        }
        if(check){
            int L=nodes[pos].l;
            int R=nodes[pos].r;
            pos=0;
            reverse(q.begin(),q.end());
            for(int i=0;i<q.size();i++){
                int c=0;
                for(int x=0;x<4;x++){
                    if(q[i]==a[x]) c=x;
                }
                if(nodes1[pos].child[c]==-1) check=false;
                pos=nodes1[pos].child[c];
            }
            if(!check) cout<<0<<'\n';
            else{
                int ans=0;
                int l=lower_bound(nodes1[pos].id.begin(),nodes1[pos].id.end(),L)-nodes1[pos].id.begin();
                int r=upper_bound(nodes1[pos].id.begin(),nodes1[pos].id.end(),R)-nodes1[pos].id.begin()-1;
                cout<<max(0,r-l+1)<<'\n';
            }
        }
        else cout<<0<<'\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...