Submission #1350310

#TimeUsernameProblemLanguageResultExecution timeMemory
1350310top1svtinSelling RNA Strands (JOI16_selling_rna)C++17
100 / 100
198 ms278624 KiB
#include <bits/stdc++.h>

using namespace std;

#define kien long long
#define FOR(i, a, b) for (int i = a;i <= b; i++)
#define FORD(i, a, b) for (int i = a;i >= b; i--)
#define pb push_back
#define pii pair <int, int>
const int MXN = 2e5 + 5;
const int base = 31;
kien ans, n, k, m;
string s[MXN];
kien dp[MXN], c[MXN];
map <int, int> pp;

struct KBB {
    vector <int> vec;
    KBB *nxt[5];

    KBB() {
        FOR (i, 0, 3) nxt[i] = NULL;
        vec.clear();
    }
};

void change (string &s) {
    FOR (i, 0, s.size() - 1) {
        if (s[i] == 'A') s[i] = 0;
        else if (s[i] == 'U') s[i] = 1;
        else if (s[i] == 'G') s[i] = 2;
        else s[i] = 3;
    }
}

void add (KBB *root, string s, int id) {
    KBB *cur = root;
    for (char c : s) {
        if (cur->nxt[c] == NULL) cur->nxt[c] = new KBB();
        cur = cur->nxt[c];
        cur->vec.pb(id);
    }
}

pii get (KBB *root, string &s) {
    KBB *cur = root;
    for (char c : s) {
        if (cur->nxt[c] != NULL) cur = cur->nxt[c];
        else return {-1, -1};
    }

    return {cur->vec[0], cur->vec.back()};
}

void xuly(KBB *root, KBB *rev, string x, string d) {
    pii range = get(root, x);
    if (range == make_pair(-1, -1)) {
        cout << 0 << "\n"; return;
    }

    KBB *cur = rev;
    for (char c : d) {
        if (cur->nxt[c] != NULL) cur = cur->nxt[c];
        else {
            cout << 0 << "\n"; return;
        }
    }

    cout << upper_bound(cur->vec.begin(), cur->vec.end(), range.second) - lower_bound(cur->vec.begin(), cur->vec.end(), range.first) << "\n";
}

main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    FOR (i, 1, n) cin >> s[i], change(s[i]);

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

    KBB *root = new KBB();
    KBB *rev = new KBB();

    FOR (i, 1, n) {
        add(root, s[i], i);
        reverse(s[i].begin(), s[i].end());
        add(rev, s[i], i);
    }

    FOR (i, 1, m) {
        string x, d;
        cin >> x >> d; reverse(d.begin(), d.end());
        change(x); change(d);
        xuly(root, rev, x, d);
    }
}

Compilation message (stderr)

selling_rna.cpp:72:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   72 | main() {
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...