Submission #598083

#TimeUsernameProblemLanguageResultExecution timeMemory
598083CSQ31Selling RNA Strands (JOI16_selling_rna)C++17
100 / 100
337 ms352440 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define owo ios_base::sync_with_stdio(0);cin.tie(0); typedef pair<int,int> pii; int ndcnt = 0; const int MAXN = 4e6+5; int ch[4][MAXN]; vector<int>ids[MAXN],que[MAXN],pts[MAXN]; int tin[MAXN],tout[MAXN]; pii pt[MAXN]; void add(string s,int id){ int v = 0; for(char x:s){ int c = 0; if(x=='C')c=1; if(x=='G')c=2; if(x=='U')c=3; if(!ch[c][v])ch[c][v] = ++ndcnt; v = ch[c][v]; } ids[v].push_back(id); } int timer = 1; void dfs(int v){ tin[v] = ++timer; for(int i=0;i<4;i++){ if(ch[i][v])dfs(ch[i][v]); } tout[v] = timer; for(int x:ids[v]){ if(x>0)pt[x].fi = tin[v]; else pt[-x].se = tin[v]; } } int find(string s){ int v = 0; for(char x:s){ //cout<<v<<'\n'; int c = 0; if(x=='C')c=1; if(x=='G')c=2; if(x=='U')c=3; if(!ch[c][v])return -1; v = ch[c][v]; } return v; } int bit[MAXN]; void upd(int pos,int val,int n){ for(int i=pos;i<=n;i+=i&(-i))bit[i]+=val; } int query(int r){ int res = 0; for(int i=r;i>0;i-=i&(-i))res+=bit[i]; return res; } int main() { //owo int n,m; cin>>n>>m; vector<string>s(n+1); vector<int>ans(m+1,0),l(m+1),r(m+1); for(int i=1;i<=n;i++){ cin>>s[i]; add(s[i],i); reverse(s[i].begin(),s[i].end()); add(s[i],-i); } dfs(0); //cout<<"pts"<<'\n'; for(int i=1;i<=n;i++){ //cout<<pt[i].fi<<" "<<pt[i].se<<'\n'; pts[pt[i].fi].push_back(pt[i].se); } //cout<<"rnage"<<'\n'; for(int i=1;i<=m;i++){ string p,q; cin>>p>>q; int v1 = find(p); reverse(q.begin(),q.end()); int v2 = find(q); if(v1==-1 || v2==-1)continue; // cout<<v1<<" "<<v2<<'\n'; //cout<<i<<" "<<tin[v1]<<" "<<tout[v1]<<" "<<tin[v2]<<" "<<tout[v2]<<'\n' //for(int j=1;j<=n;j++)if(pt[j].fi >= tin[v1] && pt[j].se >= tin[v2] && pt[j].fi <= tout[v1] && pt[j].se <= tout[v2])ans[i]++; l[i] = tin[v2]-1; r[i] = tout[v2]; que[tin[v1]-1].push_back(-i); que[tout[v1]].push_back(i); } for(int i=1;i<=timer;i++){ for(int x:pts[i])if(x)upd(x,1,timer); for(int x:que[i]){ int X = abs(x); //cout<<r[X]<<" "<<l[X]<<'\n'; int c = query(r[X]) - query(l[X]); if(x>0)ans[X]+=c; else ans[X]-=c; } } for(int i=1;i<=m;i++)cout<<ans[i]<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...