Submission #868403

#TimeUsernameProblemLanguageResultExecution timeMemory
868403cpptowinSelling RNA Strands (JOI16_selling_rna)C++17
100 / 100
249 ms194288 KiB
#include<bits/stdc++.h>
#define name "TASK"
#define fo(i,d,c) for(int i=d;i<=c;i++)
#define fod(i,c,d) for(int i=c;i>=d;i--)
#define maxn 100010
#define N 1010
#define fi first
#define se second
#define pb emplace_back
#define en cout<<"\n";
//#define int long long
#define inf 1000000000
#define pii pair<int,int>
#define vii vector<pii>
#define lb(x) x&-x
#define bit(i,j) ((i>>j)&1)
#define offbit(i,j) (i^(1<<j))
#define onbit(i,j) (i|(1<<j))
#define vi vector<int>
template <typename T1, typename T2> bool minimize(T1 &a, T2 b)
{
    if (a > b)
    {
        a = b;
        return true;
    }
    return false;
}
template <typename T1, typename T2> bool maximize(T1 &a, T2 b)
{
    if (a < b)
    {
        a = b;
        return true;
    }
    return false;
}
using namespace std;
int convert(char t)
{
    if(t == 'A') return 0;
    if(t == 'U') return 1;
    if(t == 'G') return 2;
    if(t == 'C') return 3;
}
namespace Trie
{
struct node
{
    node *child[4];
    pii range;
    node()
    {
        memset(child,0,sizeof child);
        range = {-1,-1};
    }
};
node *root = new node();
void add(string s,int id)
{
    node *p = root;
    for(char c : s)
    {
        if(p -> child[convert(c)] == NULL) p -> child[convert(c)] = new node();
        p = p -> child[convert(c)];
        if(p -> range.fi == -1) p -> range = {id,id};
        else p -> range.se = id;
    }
}
pii get(string s)
{
    node *p = root;
    for(char c : s)
    {
        if(p -> child[convert(c)] == NULL) return {-1,-1};
        p = p -> child[convert(c)];
    }
    return p -> range;
}
}
namespace RevTrie
{
struct node
{
    node *child[4];
    vi save;
    node()
    {
        memset(child,0,sizeof child);
    }
};
node *root = new node();
void add(string s,int id)
{
    node *p = root;
    for(int i = s.size() - 1 ; i >= 0 ; i--)
    {
        if(p -> child[convert(s[i])] == NULL) p -> child[convert(s[i])] = new node();
        p = p -> child[convert(s[i])];
        p ->save.pb(id);
    }
}
vi get(string s)
{
    node *p = root;
    vi v;
    for(int i = s.size() - 1 ; i >= 0 ; i--)
    {
        if(p -> child[convert(s[i])] == NULL) return v;
        p = p -> child[convert(s[i])];
    }
    return p -> save;
}
}
string s[maxn];
int n;
string p,q;
int t;
main()
{
    if(fopen(name".inp","r"))
    {
        freopen(name".inp","r",stdin);
        freopen(name".out","w",stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> t;
    fo(i,1,n) cin >> s[i];
    sort(s + 1,s+ n + 1);
    fo(i,1,n)
    {
        Trie::add(s[i],i);
        RevTrie::add(s[i],i);
    }
    while(t--)
    {
        cin >> p >> q;
        pii range = Trie::get(p);
        vi v = RevTrie::get(q);
        if(v.size() == 0 or range.fi == -1) cout << 0 << "\n";
        else
        {
            int lb = lower_bound(v.begin(),v.end(),range.fi) - v.begin();
            int ub = upper_bound(v.begin(),v.end(),range.se) - v.begin() - 1;
            cout << (ub - lb + 1) << "\n";
        }
    }
}

Compilation message (stderr)

selling_rna.cpp:119:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  119 | main()
      | ^~~~
selling_rna.cpp: In function 'int convert(char)':
selling_rna.cpp:45:1: warning: control reaches end of non-void function [-Wreturn-type]
   45 | }
      | ^
selling_rna.cpp: In function 'int main()':
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(name".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
selling_rna.cpp:124:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  124 |         freopen(name".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...