#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;
for(int i=0; i<26; i++){
nodo->child[i] = NULL;
}
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(struct Trie *root){
struct Trie *curr = root;
int cont = 2;
if(curr->longest){
cont--;
}
for(int i=0; i<26; i++){
if(curr->child[i] != NULL){
struct Trie *sig = curr->child[i];
cont += counting(sig);
}
}
return cont;
}
void printing(struct Trie *root){
struct Trie *curr = root;
//cout << curr->letra << endl;
struct Trie *seguimos = NULL;
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)){
struct Trie *sig = curr->child[i];
if(sig->longest){
seguimos = sig;
}else{
cout << sig->letra << endl;
printing(sig);
}
}
}
if(seguimos != NULL){
//cout << sizeof(*seguimos) << " " << sizeof(Trie) << endl;
//if(sizeof(*seguimos) == sizeof(Trie)){
cout << seguimos->letra << endl;
printing(seguimos);
//return;
}
if(curr->endOfWord){
cout << 'P' << endl;
}
if(!curr->longest && seguimos == NULL) 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);
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
320 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
340 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
340 KB |
printed invalid word |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Incorrect |
1 ms |
212 KB |
printed invalid word |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2 ms |
340 KB |
printed invalid word |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
23 ms |
1828 KB |
printed invalid word |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
70 ms |
5968 KB |
printed invalid word |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
207 ms |
14852 KB |
printed invalid word |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
426 ms |
36904 KB |
printed invalid word |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
346 ms |
29076 KB |
printed invalid word |
2 |
Halted |
0 ms |
0 KB |
- |