This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int nx=1e5+5;
int n, q, mp[100], v[nx], t, res[nx];
string s[nx], st, qrs[nx];
vector<int> d[nx], rem[nx];
struct node
{
int mn=1e9, mx=-1e9, sz=0;
vector<int> ed;
node* p[4]={0, 0, 0, 0};
};
typedef node* pnode;
pnode rt=new node(), rv=new node();
void add(pnode &k, int i, int idx, int sz)
{
if (idx==sz) k->ed.push_back(i);
else
{
if (!(k->p[mp[s[i][idx]]])) k->p[mp[s[i][idx]]]=new node();
add(k->p[mp[s[i][idx]]], i, idx+1, sz);
}
k->sz=k->ed.size();
for (int i=0; i<4; i++) if (k->p[i]) k->sz+=k->p[i]->sz;
}
void dfs(pnode k)
{
for (auto x:k->ed) v[++t]=x, k->mn=min(k->mn, t), k->mx=max(k->mx, t);
for (int i=0; i<4; i++) if (k->p[i]) dfs(k->p[i]), k->mn=min(k->mn, k->p[i]->mn), k->mx=max(k->mx, k->p[i]->mx);
}
pair<int, int> query(pnode k, int idx, int sz)
{
if (idx==sz) return {k->mn, k->mx};
if (!(k->p[mp[st[idx]]])) return {-1, -1};
return query(k->p[mp[st[idx]]], idx+1, sz);
}
int querysz(pnode k, int idx, int sz)
{
if (idx==sz) return k->sz;
if (!(k->p[mp[st[idx]]])) return 0;
return querysz(k->p[mp[st[idx]]], idx+1, sz);
}
int main()
{
cin.tie(NULL)->sync_with_stdio(false);
cin>>n>>q;
mp['A']=0; mp['G']=1; mp['C']=2; mp['U']=3;
for (int i=1; i<=n; i++) cin>>s[i], add(rt, i, 0, s[i].size());
dfs(rt);
for (int i=1; i<=q; i++)
{
cin>>st>>qrs[i];
reverse(qrs[i].begin(), qrs[i].end());
auto x=query(rt, 0, st.size());
if (x.first==-1) continue;
rem[x.first].push_back(i);
d[x.second].push_back(i);
//cout<<"query "<<i<<' '<<x.first<<' '<<x.second<<'\n';
}
for (int i=1; i<=n; i++) reverse(s[i].begin(), s[i].end());
//for (int i=1; i<=n; i++) cout<<"order "<<i<<' '<<v[i]<<'\n';
for (int i=1; i<=n; i++)
{
int idx=v[i];
for (auto x:rem[i]) st=qrs[x], res[x]-=querysz(rv, 0, st.size());
add(rv, idx, 0, s[idx].size());
for (auto x:d[i]) st=qrs[x], res[x]+=querysz(rv, 0, st.size());
}
for (int i=1; i<=q; i++) cout<<res[i]<<'\n';
}
Compilation message (stderr)
selling_rna.cpp: In function 'void add(node*&, int, int, int)':
selling_rna.cpp:26:32: warning: array subscript has type 'char' [-Wchar-subscripts]
26 | if (!(k->p[mp[s[i][idx]]])) k->p[mp[s[i][idx]]]=new node();
| ^
selling_rna.cpp:26:54: warning: array subscript has type 'char' [-Wchar-subscripts]
26 | if (!(k->p[mp[s[i][idx]]])) k->p[mp[s[i][idx]]]=new node();
| ^
selling_rna.cpp:27:30: warning: array subscript has type 'char' [-Wchar-subscripts]
27 | add(k->p[mp[s[i][idx]]], i, idx+1, sz);
| ^
selling_rna.cpp: In function 'std::pair<int, int> query(pnode, int, int)':
selling_rna.cpp:42:26: warning: array subscript has type 'char' [-Wchar-subscripts]
42 | if (!(k->p[mp[st[idx]]])) return {-1, -1};
| ^
selling_rna.cpp:43:33: warning: array subscript has type 'char' [-Wchar-subscripts]
43 | return query(k->p[mp[st[idx]]], idx+1, sz);
| ^
selling_rna.cpp: In function 'int querysz(pnode, int, int)':
selling_rna.cpp:49:26: warning: array subscript has type 'char' [-Wchar-subscripts]
49 | if (!(k->p[mp[st[idx]]])) return 0;
| ^
selling_rna.cpp:50:35: warning: array subscript has type 'char' [-Wchar-subscripts]
50 | return querysz(k->p[mp[st[idx]]], idx+1, sz);
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |