Submission #965351

#TimeUsernameProblemLanguageResultExecution timeMemory
965351noyancanturkType Printer (IOI08_printer)C++17
100 / 100
129 ms99784 KiB
#include "bits/stdc++.h" using namespace std; #define int int64_t #define pb push_back const int lim=1e6+100; const int mod=1e9+7; using pii=pair<int,int>; vector<char>ans; struct trie{ struct node{ int c[26],depth; bool have; }; node nds[lim]; int nextunused=2; void insert(const string&s){ int cur=1; int i=0; while(i<s.size()){ if(nds[cur].c[s[i]-'a']==0){ nds[cur].c[s[i]-'a']=nextunused++; } cur=nds[cur].c[s[i++]-'a']; } nds[cur].have=1; } struct iterator{ trie*par; int cur; iterator(trie*par,int b):par(par),cur(b){} node* operator()(){ return par->nds+cur; } void operator+=(char cc){ cur=par->nds[cur].c[cc-'a']; } bool operator==(const iterator&it){ return par==it.par&&cur==it.cur; } }; const iterator begin() { return iterator(this,1); }; const iterator end(){ return iterator(this,0); } int depdfs(node*p){ if(!p)return 0; p->depth=1; for(int i=0;i<26;i++){ if(p->c[i])p->depth=max(p->depth,1+depdfs(nds+p->c[i])); } return p->depth; } void dfs(node*p,bool nope){ if(!p)return; if(p->have)ans.pb('P'); int maxchild=0,maxind=-1; if(!nope)for(int i=0;i<26;i++){ if(nds[maxchild].depth<nds[p->c[i]].depth){ maxchild=p->c[i]; maxind=i; } } for(int i=0;i<26;i++){ if(p->c[i]!=maxchild&&p->c[i]){ ans.pb(i+'a'); dfs(nds+p->c[i],1); ans.pb('-'); } } if(maxchild){ ans.pb(maxind+'a'); dfs(nds+maxchild,0); } } }tr; signed main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #ifdef Local freopen(".in","r",stdin); freopen(".out","w",stdout); #endif int n; cin>>n; for(int i=0;i<n;i++){ string s; cin>>s; tr.insert(s); } tr.depdfs(tr.nds+1); tr.dfs(tr.nds+1,0); cout<<ans.size()<<"\n"; for(char c:ans){ cout<<c<<"\n"; } }

Compilation message (stderr)

printer.cpp: In member function 'void trie::insert(const string&)':
printer.cpp:26:16: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   26 |         while(i<s.size()){
      |               ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...