답안 #440658

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
440658 2021-07-02T16:32:20 Z codebuster_10 Type Printer (IOI08_printer) C++17
100 / 100
268 ms 121812 KB
#include <bits/stdc++.h>
using namespace std;

#define int int64_t //be careful about this 
#define endl "\n"
#define f(i,a,b) for(int i=int(a);i<int(b);++i)

#define pr pair
#define ar array
#define fr first
#define sc second
#define vt vector
#define pb push_back
#define eb emplace_back

#define SZ(x) ((int)(x).size())
#define all(a) (a).begin(),(a).end()
#define allr(a) (a).rbegin(),(a).rend()
#define mem(a,b) memset(a, b, sizeof(a))

template<class A> void rd(vt<A>& v);
template<class T> void rd(T& x){ cin >> x;}
template<class H, class... T> void rd(H& h, T&... t) { rd(h); rd(t...);}
template<class A> void rd(vt<A>& x) { for(auto& a : x) rd(a);}

template<class T> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0;}
template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0;}

template<typename T>
void __p(T a) {
  cout<<a; 
}
template<typename T, typename F>
void __p(pair<T, F> a) {
  cout<<"{";
  __p(a.first);
  cout<<",";
  __p(a.second);
  cout<<"}\n"; 
}
template<typename T>
void __p(std::vector<T> a) {
  cout<<"{";
  for(auto it=a.begin(); it<a.end(); it++)
    __p(*it),cout<<",}\n"[it+1==a.end()]; 
}
template<typename T, typename ...Arg>
void __p(T a1, Arg ...a) {
  __p(a1);
  __p(a...);
}
template<typename Arg1>
void __f(const char *name, Arg1 &&arg1) {
  cout<<name<<" : ";
  __p(arg1);
  cout<<endl;
}
template<typename Arg1, typename ... Args>
void __f(const char *names, Arg1 &&arg1, Args &&... args) {
  int bracket=0,i=0;
  for(;; i++)
    if(names[i]==','&&bracket==0)
      break;
    else if(names[i]=='(')
      bracket++;
    else if(names[i]==')')
      bracket--;
  const char *comma=names+i;
  cout.write(names,comma-names)<<" : ";
  __p(arg1);
  cout<<" | ";
  __f(comma+1,args...);
}


void setIO(string s = "") {
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); 
  // remove this when size of input is not fixed.
  cin.exceptions(cin.failbit); 
	cout.precision(15);	cout << fixed;
  if(SZ(s)){
  	freopen((s+".in").c_str(),"r",stdin);
  	freopen((s+".out").c_str(),"w",stdout);
  }
}


/*********************************************Look Below******************************************************************/












































template<const int ALPHABET>
struct prefix_tree {
	
	struct trie_node {
  	int link[ALPHABET];
    int what;
    int depth;
    int is_word;
 
    trie_node() {
      memset(link, -1, sizeof(link));
      is_word = 0;
    }
	};
	
	vector<trie_node> trie;
	
	prefix_tree(){
		trie.emplace_back();
		trie[0].depth = 0;
		trie[0].what = -1;
	}
	
	void create_node(int parent, int c) {
    trie.emplace_back();
    trie.back().what = c;
    trie.back().depth = trie[parent].depth + 1;
	}
	
	int get_or_create_node(int current, int c) {
    if (trie[current].link[c] < 0) {
      trie[current].link[c] = trie.size();
      create_node(current, c);
    }
 
    return trie[current].link[c];
	}
 
	int insert_str(const string &str) {
		int current = 0;
    for(char c : str){
      current = get_or_create_node(current, c - 'a');
 		}
 		trie[current].is_word++;
    return current;
	}
	
	void fun(){
		int req = 0;
		
		{
			function<void(int)> dfs = [&](int i){
				if(trie[i].depth > trie[req].depth) req = i;
				for(int j = 0; j < ALPHABET; ++j) if(trie[i].link[j] > 0){
					dfs(trie[i].link[j]);
				}
			};
			dfs(0);
		}
		
		
		{
			function<bool(int)> dfs = [&](int i){
				if(i == req) return true;
				int to_swap = -1;
				for(int j = 0; j < ALPHABET; ++j) if(trie[i].link[j] > 0){
					if(dfs(trie[i].link[j])){
						to_swap = j;
					}
				}
				if(to_swap < 0){
					return false;
				}else{
					swap(trie[i].link[to_swap],trie[i].link[ALPHABET - 1]);
					return true;
				}
			};
			assert(dfs(0));
		}
		
		vt<char> ans;
		{
			function<void(int)> dfs = [&](int i){
				
				f(_,0,trie[i].is_word)	ans.pb('P');
				
				if(i == req){
					
					cout << SZ(ans) << endl;
					
					for(auto c : ans) cout << c << endl;
					
					exit(0);
					
				}else{
					
					for(int j = 0; j < ALPHABET; ++j) if(trie[i].link[j] > 0){
						int k = trie[i].link[j];
						ans.pb(char(trie[k].what + 'a'));
						dfs(k);
					}
					
					ans.pb('-');
				}
			};
			dfs(0);
		}
	}
	
};

prefix_tree<26> trie;

signed main(){
  setIO();
  int n; rd(n);
  vt<string> words(n);
  rd(words);
  
  for(auto s : words){
  	trie.insert_str(s);
  }
  
  trie.fun();
}

























Compilation message

printer.cpp: In function 'void setIO(std::string)':
printer.cpp:82:11: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   82 |    freopen((s+".in").c_str(),"r",stdin);
      |    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
printer.cpp:83:11: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |    freopen((s+".out").c_str(),"w",stdout);
      |    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 332 KB Output is correct
2 Correct 0 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 332 KB Output is correct
2 Correct 0 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 332 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 588 KB Output is correct
2 Correct 3 ms 1404 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2340 KB Output is correct
2 Correct 6 ms 4096 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 7996 KB Output is correct
2 Correct 33 ms 15544 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 46 ms 15672 KB Output is correct
2 Correct 12 ms 4608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 109 ms 60692 KB Output is correct
2 Correct 240 ms 121100 KB Output is correct
3 Correct 124 ms 62092 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 31028 KB Output is correct
2 Correct 268 ms 121396 KB Output is correct
3 Correct 159 ms 62384 KB Output is correct
4 Correct 213 ms 121812 KB Output is correct