제출 #392407

#제출 시각아이디문제언어결과실행 시간메모리
392407junodeveloperSelling RNA Strands (JOI16_selling_rna)C++17
100 / 100
316 ms343896 KiB
#include <bits/stdc++.h> #define fi first #define se second #define sz(v) ((int)v.size()) #define all(v) (v).begin(), (v).end() #define pb push_back using namespace std; #ifdef LOCAL #define dmp(...) _dmp(#__VA_ARGS__, __VA_ARGS__) #else #define dmp(...) (__VA_ARGS__) #endif template<class TA,class TB> ostream& operator<<(ostream& os,const pair<TA,TB>& p){ return os<<"{"<<p.fi<<","<<p.se<<"}"; } template<class T> ostream& operator<<(ostream& os,const vector<T>& v){ os<<"{";for(auto& e:v)os<<e<<",";return os<<"}"; } template<class TH> void _dmp(const char *sdbg, TH h){cout<<sdbg<<"="<<h<<endl;} template<class TH, class... TA> void _dmp(const char *sdbg, TH h, TA...a){ while(*sdbg!=',')cout<<*sdbg++;cout<<"="<<h<<","; _dmp(sdbg+1, a...); } typedef long long ll; typedef long double ld; typedef pair<int,int> pii; const int INF=1e9; const int maxsum=2000010; const int maxm=4; int trie[maxsum][maxm],sub[maxsum],tcnt; int L[maxsum],R[maxsum]; vector<int> out[maxsum]; vector<int> ord; int val(char c) { if(c=='A')return 0; if(c=='C')return 1; if(c=='G')return 2; return 3; } void add(int i,string& s) { int cur=0; sub[0]++; for(auto& e : s) { if(!trie[cur][val(e)])trie[cur][val(e)]=++tcnt; cur=trie[cur][val(e)]; sub[cur]++; } out[cur].pb(i); } void prepare(int cur) { for(int i:out[cur]) { ord.pb(i); L[cur]=min(L[cur],sz(ord)-1); R[cur]=max(R[cur],sz(ord)-1); } for(int i=0;i<4;i++) { if(trie[cur][i]) { prepare(trie[cur][i]); L[cur]=min(L[cur],L[trie[cur][i]]); R[cur]=max(R[cur],R[trie[cur][i]]); } } } int n,m; string S[2000010]; string P[2000010],Q[2000010]; int Pl[2000010],Ql[2000010]; vector<pii> qry[2000010]; int ans[2000010]; int main() { ios::sync_with_stdio(false); cin.tie(0); int i,j,k; cin>>n>>m; for(i=0;i<n;i++) { cin>>S[i]; add(i,S[i]); } for(i=0;i<=tcnt;i++) { L[i]=INF; R[i]=0; } prepare(0); for(i=0;i<m;i++) { cin>>P[i]>>Q[i]; reverse(all(Q[i])); Pl[i]=P[i].length(); Ql[i]=Q[i].length(); int cur=0; for(j=0;j<Pl[i];j++) { cur=trie[cur][val(P[i][j])]; if(!cur)break; } if(!cur)continue; if(L[cur]>0)qry[L[cur]-1].pb({i,-1}); qry[R[cur]].pb({i,1}); } for(i=0;i<=tcnt;i++) { sub[i]=0; out[i].clear(); for(j=0;j<4;j++)trie[i][j]=0; } tcnt=0; for(i=0;i<n;i++) { reverse(all(S[ord[i]])); add(ord[i],S[ord[i]]); for(auto& it:qry[i]) { int cur=0; for(j=0;j<Ql[it.fi];j++) { cur=trie[cur][val(Q[it.fi][j])]; if(!cur)break; } if(cur)ans[it.fi]+=it.se*sub[cur]; } } for(i=0;i<m;i++)cout<<ans[i]<<'\n'; return 0; }

컴파일 시 표준 에러 (stderr) 메시지

selling_rna.cpp: In function 'void _dmp(const char*, TH, TA ...)':
selling_rna.cpp:22:1: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
   22 | while(*sdbg!=',')cout<<*sdbg++;cout<<"="<<h<<","; _dmp(sdbg+1, a...);
      | ^~~~~
selling_rna.cpp:22:32: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
   22 | while(*sdbg!=',')cout<<*sdbg++;cout<<"="<<h<<","; _dmp(sdbg+1, a...);
      |                                ^~~~
selling_rna.cpp: In function 'int main()':
selling_rna.cpp:73:10: warning: unused variable 'k' [-Wunused-variable]
   73 |  int i,j,k;
      |          ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...