# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
640044 | a_aguilo | Type Printer (IOI08_printer) | C++14 | 1095 ms | 100456 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
struct Trie{
struct Trie *child[26];
char letra;
bool endOfWord,longest;
};
struct Trie *createNode(char letra){
struct Trie *nodo = new Trie;
memset(nodo->child, NULL, sizeof(nodo->child));
nodo->endOfWord = false;
nodo->longest = false;
nodo->letra = letra;
return nodo;
}
void insert(struct Trie *root, string key, bool masLarga){
struct Trie *curr = root;
for(int i=0; i<(int)key.size(); i++){
int index = key[i] - 'a';
if(curr->child[index] == NULL){
curr->child[index] = createNode(key[i]);
}
curr = curr->child[index];
if(masLarga) curr->longest = true;
}
curr->endOfWord = true;
}
int counting(Trie *root){
Trie *curr = root;
int cont = 2;
if(curr->longest){
cont--;
}
for(int i=0; i<26; i++){
if(curr->child[i] != NULL){
Trie *sig = curr->child[i];
cont += counting(sig);
}
}
return cont;
}
void printing(Trie *root){
Trie *curr = root;
//cout << curr->letra << endl;
if(curr->endOfWord){
cout << 'P' << endl;
}
Trie *seguimos = root;
for(int i=0; i<26; i++){
if(curr->child[i] != NULL){
//cout << sizeof(*(curr->child[i])) << " " << sizeof(Trie) << endl;
//if(sizeof(*(curr->child[i])) == sizeof(Trie)){
Trie *sig = curr->child[i];
if(sig->longest){
seguimos = sig;
}else{
cout << sig->letra << endl;
printing(sig);
}
}
}
if(seguimos != root){
//cout << sizeof(*seguimos) << " " << sizeof(Trie) << endl;
//if(sizeof(*seguimos) == sizeof(Trie)){
cout << seguimos->letra << endl;
printing(seguimos);
return;
}
if(!curr->longest) cout << '-' << endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
struct Trie *root = createNode('0');
root->longest = true;
vector<string> v(n);
pair<int,int> longest;
longest.first = 1;
longest.second = 0;
for(int i=0; i<n; i++){
string s;
cin >> s;
v[i] = s;
if((int)s.size() > longest.first){
longest.first = s.size();
longest.second = i;
}
}
for(int i=0; i<n; i++){
if(i == longest.second){
insert(root,v[i],true);
}else insert(root,v[i],false);
}
//cout << sizeof(Trie) << endl;
//cout << sizeof(*root) << endl;
cout << counting(root)+n-1 << endl;
printing(root);
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |