# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
162595 | HungAnhGoldIBO2020 | Selling RNA Strands (JOI16_selling_rna) | C++14 | 1173 ms | 1048576 KiB |
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 N=2e6+2;
const int inf=1e9+7;
struct node{
int go[26],l=0,r=0;
} pre[N];
struct node1{
int go[26];
vector<int> idx;
} suf[N];
pair<int,int> lis;
string x[N];
int cnt=0,cnt1=0;
void insert_pre(string s,int idx1){
int now=0;
for(int i=0;i<s.size();i++){
if(!pre[now].go[(int)(s[i]-'A')]){
cnt++;
pre[now].go[(int)(s[i]-'A')]=cnt;
}
now=pre[now].go[(int)(s[i]-'A')];
if(!pre[now].l){
pre[now].l=idx1;
}
pre[now].r=idx1;
}
}
void insert_suf(string s,int idx2){
int now=0;
for(int i=0;i<s.size();i++){
if(!suf[now].go[(int)(s[i]-'A')]){
cnt++;
suf[now].go[(int)(s[i]-'A')]=cnt;
}
now=suf[now].go[(int)(s[i]-'A')];
suf[now].idx.push_back(idx2);
}
}
void get_range(string s){
int now=0;
for(int i=0;i<s.size();i++){
if(!pre[now].go[(int)(s[i]-'A')]){
lis.first=inf;
lis.second=-inf;
return;
}
now=pre[now].go[(int)(s[i]-'A')];
}
lis.first=pre[now].l;
lis.second=pre[now].r;
}
int get_ans(string s){
int now=0;
for(int i=0;i<s.size();i++){
if(!suf[now].go[(int)(s[i]-'A')]){
return 0;
}
now=suf[now].go[(int)(s[i]-'A')];
}
int num1=upper_bound(suf[now].idx.begin(),suf[now].idx.end(),lis.second)-suf[now].idx.begin()-1;
int num2=lower_bound(suf[now].idx.begin(),suf[now].idx.end(),lis.first)-suf[now].idx.begin()-1;
// cout<<now<<" cac"<<endl;
// for(int i:suf[now].idx){
// cout<<i<<' ';
// }
// cout<<"lon "<<num1<<' '<<num2<<endl;
return num1-num2;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n,q,i,j,k,l;
cin>>n>>q;
for(i=1;i<=n;i++){
cin>>x[i];
}
sort(x+1,x+1+n);
string t,t1;
for(i=1;i<=n;i++){
t=x[i];
insert_pre(t,i);
reverse(t.begin(),t.end());
insert_suf(t,i);
}
for(i=1;i<=q;i++){
cin>>t>>t1;
get_range(t);
if(lis.second==-inf){
cout<<"0\n";
continue;
}
reverse(t1.begin(),t1.end());
cout<<get_ans(t1)<<'\n';
}
}
Compilation message (stderr)
# | 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... |