Submission #219405

#TimeUsernameProblemLanguageResultExecution timeMemory
219405MKopchevSelling RNA Strands (JOI16_selling_rna)C++14
100 / 100
440 ms322880 KiB
#include<bits/stdc++.h>
using namespace std;
const int nmax=1e5+42;

int n,q;

struct info
{
    int nxt[26];
};

vector< info > trie;

int pointer=0;

vector< vector<int> > seen;

int create_info()
{
    seen.push_back({});

    info idle;
    for(int i=0;i<26;i++)
        idle.nxt[i]=-1;

    trie.push_back(idle);
    pointer++;

    //cout<<"create_info= "<<pointer-1<<endl;

    return pointer-1;
}

pair<string,int> inp[nmax];

void add(int id)
{

    int current=0;
    for(int i=0;i<inp[id].first.size();i++)
    {
        char c=inp[id].first[i];

        if(trie[current].nxt[c-'A']==-1)
        {
            int mem=create_info();
            trie[current].nxt[c-'A']=mem;
        }

        //cout<<trie[current].nxt[c-'A']<<endl;

        current=trie[current].nxt[c-'A'];

        seen[current].push_back(id);
    }
}
string sorted_strings[nmax];

string en;

int query(int l,int r)
{
    int current=0;
    for(int i=0;i<en.size();i++)
    {
        char c=en[i];

        if(trie[current].nxt[c-'A']==-1)return 0;
        else current=trie[current].nxt[c-'A'];
    }

    int u=lower_bound(seen[current].begin(),seen[current].end(),l)-seen[current].begin();
    int v=upper_bound(seen[current].begin(),seen[current].end(),r)-seen[current].begin();
    return v-u;
}
int ask()
{
    string st;
    cin>>st>>en;

    reverse(en.begin(),en.end());

    int l=lower_bound(sorted_strings+1,sorted_strings+n+1,st)-sorted_strings;
    st[st.size()-1]++;
    int r=lower_bound(sorted_strings+1,sorted_strings+n+1,st)-sorted_strings;r--;

    //cout<<"query "<<l<<" "<<r<<endl;

    if(l>r)return 0;
    return query(l,r);
}

int main()
{
    create_info();

    ios_base::sync_with_stdio(false);
    cin.tie();
    cout.tie();

    cin>>n>>q;
    for(int i=1;i<=n;i++)
        cin>>sorted_strings[i];

    sort(sorted_strings+1,sorted_strings+n+1);

    for(int i=1;i<=n;i++)
        inp[i]={sorted_strings[i],i};

    for(int i=1;i<=n;i++)
        reverse(inp[i].first.begin(),inp[i].first.end());

    for(int i=1;i<=n;i++)
        add(i);

    for(int i=1;i<=q;i++)
        printf("%i\n",ask());
    return 0;
}

Compilation message (stderr)

selling_rna.cpp: In function 'void add(int)':
selling_rna.cpp:40:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<inp[id].first.size();i++)
                 ~^~~~~~~~~~~~~~~~~~~~~
selling_rna.cpp: In function 'int query(int, int)':
selling_rna.cpp:64:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<en.size();i++)
                 ~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...