제출 #1071026

#제출 시각아이디문제언어결과실행 시간메모리
1071026sitablechairSelling RNA Strands (JOI16_selling_rna)C++17
100 / 100
281 ms158800 KiB
#include <bits/stdc++.h> #define ll long long #define ldb long double #define endl '\n' #define For(i,l,r) for(int i=l;i<=r;i++) #define ForD(i,r,l) for(int i=r;i>=l;i--) #define REP(i,l,r) For(i,l,r-1) #define PER(i,r,l) ForD(i,r-1,l) #define ff first #define ss second #define pb emplace_back #define all(x) x.begin(),x.end() #define All(x,n) x+1,x+1+n #define Alll(x,n) x,x+n #define sz(x) (signed)x.size() #define unq(x) x.resize(unique(all(x))-x.begin()) #define mpa make_pair #ifdef NCGM #include"debug.h" #else #define debug(...) "fr"; #endif using namespace std; const int N=2e5+9,BLOCK=350; int id[500],sus=0; struct Trie{ struct Node{ Node* child[4]; int exist, cnt,mini=-1; Node() { for (int i = 0; i < 4; i++) child[i] = NULL; exist = cnt = 0; } }; int cur; Node* root; Trie() : cur(0) { root = new Node(); }; void add_string(string s,int ind=0) { Node* p = root; for (auto f : s) { int c = id[f]; if (p->child[c] == NULL) p->child[c] = new Node(); p = p->child[c]; if (ind) { if (p->mini==-1) p->mini=ind; else p->mini=min(p->mini,ind); } p->cnt++; } p->exist++; } bool delete_string_recursive(Node* p, string& s, int i) { if (i != (int)s.size()) { int c = id[s[i]]; bool isChildDeleted = delete_string_recursive(p->child[c], s, i + 1); if (isChildDeleted) p->child[c] = NULL; } else p->exist--; if (p != root) { p->cnt--; if (p->cnt == 0) { delete(p); return true; } } return false; } void delete_string(string s) { if (find_string(s) == false) return; delete_string_recursive(root, s, 0); } bool find_string(string s) { Node* p = root; for (auto f : s) { int c = id[f]; if (p->child[c] == NULL) return false; p = p->child[c]; } return (p->exist != 0); } pair<int,int> get(string s) { Node* p = root; for (auto f : s) { int c = id[f]; if (p->child[c] == NULL) return mpa(-1,-1); p = p->child[c]; } return mpa(p->mini,p->mini+p->cnt-1); } int getnum(string s) { Node* p = root; for (auto f : s) { int c = id[f]; if (p->child[c] == NULL) return 0; p = p->child[c]; } return p->cnt; } }; struct query { int l,r,ind; string p,q; }; Trie trie,trie1; query qr[N]; string a[N],a1[N]; int n,m,ans[N],tmp=0; int main() { cin.tie(0)->sync_with_stdio(0); id['C']=0,id['U']=1,id['G']=2,id['A']=3; /*freopen("D.INP","r",stdin); freopen("D.OUT","w",stdout);*/ cin >> n >> m; For(i,1,n) cin >> a[i]; sort(a,a+1+n); For(i,1,n) { a1[i]=a[i]; reverse(all(a1[i])); } For(i,1,n) trie.add_string(a[i],i); For(i,1,m) { cin >> qr[i].p >> qr[i].q; reverse(all(qr[i].q)); qr[i].ind=i; pair<int,int> sus=trie.get(qr[i].p); qr[i].l=sus.ff; qr[i].r=sus.ss; } sort(qr+1,qr+1+m,[](const query &A, const query &B) { if (A.l/BLOCK!=B.l/BLOCK) return A.l/BLOCK<B.l/BLOCK; return A.r<B.r; }); fill(ans,ans+1+n,0); int l=qr[1].l,r=qr[1].r; For(i,qr[1].l,qr[1].r) { if (i<0) break; trie1.add_string(a1[i]); } if (qr[1].l>0 && qr[1].r>0) ans[qr[1].ind]=trie1.getnum(qr[1].q); For(i,2,m) { if (qr[i].l<0 || qr[i].r<0) break; if (l>qr[i].l) For(j,qr[i].l,l-1) trie1.add_string(a1[j]); if (r<qr[i].r) For(j,r+1,qr[i].r) trie1.add_string(a1[j]); if (l<qr[i].l) For(j,l,qr[i].l-1) trie1.delete_string(a1[j]); if (r>qr[i].l) For(j,qr[i].r+1,r) trie1.delete_string(a1[j]); l=qr[i].l,r=qr[i].r; ans[qr[i].ind]=trie1.getnum(qr[i].q); } For(i,1,m) cout << ans[i] << endl; return 0; }

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

selling_rna.cpp: In member function 'void Trie::add_string(std::string, int)':
selling_rna.cpp:52:24: warning: array subscript has type 'char' [-Wchar-subscripts]
   52 |             int c = id[f];
      |                        ^
selling_rna.cpp: In member function 'bool Trie::delete_string_recursive(Trie::Node*, std::string&, int)':
selling_rna.cpp:65:28: warning: array subscript has type 'char' [-Wchar-subscripts]
   65 |             int c = id[s[i]];
      |                            ^
selling_rna.cpp: In member function 'bool Trie::find_string(std::string)':
selling_rna.cpp:90:24: warning: array subscript has type 'char' [-Wchar-subscripts]
   90 |             int c = id[f];
      |                        ^
selling_rna.cpp: In member function 'std::pair<int, int> Trie::get(std::string)':
selling_rna.cpp:99:24: warning: array subscript has type 'char' [-Wchar-subscripts]
   99 |             int c = id[f];
      |                        ^
selling_rna.cpp: In member function 'int Trie::getnum(std::string)':
selling_rna.cpp:108:24: warning: array subscript has type 'char' [-Wchar-subscripts]
  108 |             int c = id[f];
      |                        ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...