Submission #1267622

#TimeUsernameProblemLanguageResultExecution timeMemory
1267622yoshi_33550336Selling RNA Strands (JOI16_selling_rna)C++20
100 / 100
267 ms330764 KiB
#include <bits/stdc++.h>
using namespace std;
#ifndef yoshi_likes_e4
#define endl '\n'
#endif
#define problem ""
#define multitest 0
#define debug(x) cerr << #x << " = " << x << endl;
void init()
{
}
namespace Trie1
{
struct Node
{
    int32_t child[26]{};
    int l = 100000;
    int r = -1;
};
Node nodes[2000001];
int cur = 1;
inline int try_push_back(int x, int c, int idx)
{
    if (!nodes[x].child[c])
        nodes[x].child[c] = cur++;
    int y = nodes[x].child[c];
    nodes[y].l = min(nodes[y].l, idx);
    nodes[y].r = max(nodes[y].r, idx);
    return y;
}
void insertString(string &s, int idx)
{
    int cur = 0;
    for (auto &i : s)
        cur = try_push_back(cur, i - 'A', idx);
}
pair<int, int> getRange(string &s)
{
    int cur = 0;
    for (auto &i : s)
    {
        cur = nodes[cur].child[i - 'A'];
        if (!cur)
            return {100000, -1};
    }
    return {nodes[cur].l, nodes[cur].r};
}
}; // namespace Trie1
namespace Trie2
{
struct Node
{
    int32_t child[26]{};
};
Node nodes[2000001];
vector<pair<int, int>> s_cnt[2000001];
int cur = 1;
inline int try_push_back(int x, int c, int idx)
{
    if (!nodes[x].child[c])
        nodes[x].child[c] = cur++;
    int y = nodes[x].child[c];
    s_cnt[y].push_back({idx, (s_cnt[y].size() ? s_cnt[y].back().second : 0) + 1});
    return y;
}
void insertString(string &s, int idx)
{
    int cur = 0;
    for (auto &i : s)
        cur = try_push_back(cur, i - 'A', idx);
}
int getnStrings(string &s, int idx1, int idx2)
{
    if (idx1 > idx2)
        return 0;
    int cur = 0;
    for (auto &i : s)
    {
        cur = nodes[cur].child[i - 'A'];
        if (!cur)
            return 0;
    }
    int xc = upper_bound(s_cnt[cur].begin(), s_cnt[cur].end(), pair<int, int>{idx2, 100000}) - 1 - s_cnt[cur].begin();
    int yc = lower_bound(s_cnt[cur].begin(), s_cnt[cur].end(), pair<int, int>{idx1, 0}) - 1 - s_cnt[cur].begin();
    if (xc < 0)
        return 0;
    if (yc < 0)
        return s_cnt[cur][xc].second;
    return s_cnt[cur][xc].second - s_cnt[cur][yc].second;
}
}; // namespace Trie2

void Yoshi()
{
    int n, q;
    cin >> n >> q;
    vector<string> sp(n);
    for (auto &i : sp)
        cin >> i;
    sort(sp.begin(), sp.end());
    for (int i = 0; i < n; i++)
        Trie1::insertString(sp[i], i);
    for (int i = 0; i < n; i++)
        reverse(sp[i].begin(), sp[i].end()), Trie2::insertString(sp[i], i);
    for (int i = 0; i < q; i++)
    {
        string s, t;
        cin >> s >> t;
        reverse(t.begin(), t.end());
        auto [a, b] = Trie1::getRange(s);
        cout << Trie2::getnStrings(t, a, b) << endl;
    }
}
signed main()
{
#ifndef yoshi_likes_e4
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    if (fopen(problem ".inp", "r"))
    {
        freopen(problem ".inp", "r", stdin);
        freopen(problem ".out", "w", stdout);
    }
#endif
    init();
    int t = 1;
#if multitest
    cin >> t;
#endif
    while (t--)
        Yoshi();
}

Compilation message (stderr)

selling_rna.cpp: In function 'int main()':
selling_rna.cpp:122:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  122 |         freopen(problem ".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
selling_rna.cpp:123:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |         freopen(problem ".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...