Advertisement
mickypinata

GCJ2019-1A3: Alien Rhyme

Jul 11th, 2021
819
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct node {
  5.     bool isWord;
  6.     node **nxt;
  7.     node(){
  8.         isWord = false;
  9.         nxt = new node*[26];
  10.         for(int i = 0; i < 26; ++i){
  11.             nxt[i] = NULL;
  12.         }
  13.     }
  14. };
  15.  
  16. void addWord(string &str, int i, node *root){
  17.     if(i == (int)str.size()){
  18.         root -> isWord = true;
  19.         return;
  20.     }
  21.     int nxtIdx = str[i] - 'A';
  22.     if(root -> nxt[nxtIdx] == NULL){
  23.         root -> nxt[nxtIdx] = new node();
  24.         addWord(str, i + 1, root -> nxt[nxtIdx]);
  25.     } else {
  26.         addWord(str, i + 1, root -> nxt[nxtIdx]);
  27.     }
  28. }
  29.  
  30. void deleteTrie(node *root){
  31.     for(int i = 0; i < 26; ++i){
  32.         if(root -> nxt[i] != NULL){
  33.             deleteTrie(root -> nxt[i]);
  34.         }
  35.     }
  36.     delete(root);
  37. }
  38.  
  39. int cnt;
  40. int DFS(node *root){
  41.     int wordCnt = (int)root -> isWord;
  42.     for(int i = 0; i < 26; ++i){
  43.         if(root -> nxt[i] != NULL){
  44.             wordCnt += DFS(root -> nxt[i]);
  45.         }
  46.     }
  47.     if(wordCnt >= 2){
  48.         wordCnt -= 2;
  49.         cnt += 2;
  50.     }
  51.     return wordCnt;
  52. }
  53.  
  54. int main(){
  55.  
  56.     int Q;
  57.     scanf("%d", &Q);
  58.     for(int q = 1; q <= Q; ++q){
  59.         cout << "Case #" << q << ": ";
  60.         int nStr;
  61.         node *root = new node();
  62.         scanf("%d", &nStr);
  63.         for(int i = 1; i <= nStr; ++i){
  64.             string str;
  65.             cin >> str;
  66.             reverse(str.begin(), str.end());
  67.             addWord(str, 0, root);
  68.         }
  69.         cnt = 0;
  70.         for(int i = 0; i < 26; ++i){
  71.             if(root -> nxt[i] != NULL){
  72.                 DFS(root -> nxt[i]);
  73.             }
  74.         }
  75.         cout << cnt << '\n';
  76.         deleteTrie(root);
  77.     }
  78.  
  79.     return 0;
  80. }
  81.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement