Submission #1070533

#TimeUsernameProblemLanguageResultExecution timeMemory
1070533vjudge1Selling RNA Strands (JOI16_selling_rna)C++17
100 / 100
1302 ms490064 KiB
#include <bits/stdc++.h>
using namespace std;

long long a[2000005][5], b[2000005][5], l[2000005][5], r[2000005][5], id1=1, id2=1;
vector<long long> ans[2000005][5];
string s[100005], pre, suf;

string fix(string s)
{
    long long n=s.size(), i;
    string t="";
    for (i=0; i<n; i++)
    {
        if (s[i]=='C') {t+='a';}
        else if (s[i]=='U') {t+='b';}
        else if (s[i]=='G') {t+='c';}
        else {t+='d';};
    };
    return t;
}

void add(string s, long long k)
{
    long long n=s.size(), i, j=0;
    for (i=0; i<n; i++)
    {
        if (a[j][s[i]-'a']==0) {a[j][s[i]-'a']=id1++; l[j][s[i]-'a']=r[j][s[i]-'a']=k;}
        else {r[j][s[i]-'a']=k;};
        j=a[j][s[i]-'a'];
    };
}

void addsuf(string s, long long k)
{
    long long n=s.size(), i, j=0;
    for (i=0; i<n; i++)
    {
        if (b[j][s[i]-'a']==0) {b[j][s[i]-'a']=id2++;};
        ans[j][s[i]-'a'].push_back(k);
        j=b[j][s[i]-'a'];
    };
}

pair<long long, long long> solvepre(string s)
{
    long long n=s.size(), i, j=0;
    for (i=0; i<n-1; i++)
    {
        if (a[j][s[i]-'a']==0) {return {0LL, 0LL};};
        j=a[j][s[i]-'a'];
    };
    return {l[j][s[n-1]-'a'], r[j][s[n-1]-'a']};
}

vector<long long> solvesuf(string s)
{
    long long n=s.size(), i, j=0;
    vector<long long> v;
    for (i=0; i<n-1; i++)
    {
        if (b[j][s[i]-'a']==0) {return v;};
        j=b[j][s[i]-'a'];
    };
    return ans[j][s[n-1]-'a'];
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    long long n, m, i;
    pair<long long, long long> p;
    vector<long long> v;
    cin >> n >> m;
    for (i=1; i<=n; i++)
    {
        cin >> s[i];
        s[i]=fix(s[i]);
    };
    sort(s+1, s+n+1);
    for (i=1; i<=n; i++)
    {
        add(s[i], i);
        reverse(s[i].begin(), s[i].end());
        addsuf(s[i], i);
    };
    while (m--)
    {
        cin >> pre >> suf;
        pre=fix(pre); suf=fix(suf);
        p=solvepre(pre);
        reverse(suf.begin(), suf.end());
        v=solvesuf(suf);
        cout << upper_bound(v.begin(), v.end(), p.second)-lower_bound(v.begin(), v.end(), p.first) << "\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...