spacepaste

  1.  
  2. // Returns true if key presents in trie, else false
  3. bool search(struct TrieNode **root, const char *key, int idx)
  4. {
  5. int level;
  6. int length = strlen(key);
  7. int index;
  8. struct TrieNode *pCrawl = *root;
  9. // pi(idx);
  10. for (level = 0; level < length; level++)
  11. {
  12. str_new(ch);
  13. str_insert_char(ch, key[level]);
  14. if (ch.type & STR_TYPE_DIGIT) index = INT_TO_INDEX(key[level]);
  15. else if (ch.type & STR_TYPE_ALPHABETIC) index = CHAR_TO_INDEX(key[level]);
  16. str_free(ch)
  17. if (!pCrawl->children[index]) {
  18. index = CHAR_TO_INDEX('x');
  19. if (!pCrawl->children[index]) return false;
  20. }
  21. pCrawl = pCrawl->children[index];
  22. // pp(pCrawl->next);
  23. if (pCrawl->next) {
  24. // pi(pCrawl->next->idx)
  25. // pp(*root)
  26. *root = pCrawl->next;
  27. // pp(*root)
  28. // bool result = search(pCrawl->next, key, idx);
  29. // pb(result);
  30. }
  31. }
  32. // pi(pCrawl->count)
  33. bool final_match = false;
  34. for (int i = 0; i < pCrawl->count; i++) {
  35. // pi(pCrawl->idx[i])
  36. if (pCrawl->idx[i] == idx) final_match = true;
  37. }
  38. // pb(final_match)
  39. return (pCrawl != NULL && pCrawl->isEndOfWord && final_match);
  40. }
  41. // Returns true if key presents in trie, else false
  42. bool search_segmented(struct TrieNode *root, struct TrieNode *segments, const char *key)
  43. {
  44. int level;
  45. int length = strlen(key);
  46. int index;
  47. struct TrieNode *pCrawl = root;
  48. str_new(segment);
  49. int idx = 0;
  50. for (level = 0; level < length; level++)
  51. {
  52. str_insert_char(segment, key[level]);
  53. ps(segment.string);
  54. // pp(segments)
  55. bool result1 = search(&segments, segment.string, idx);
  56. // pp(segments)
  57. pi(idx)
  58. pb(result1);
  59. if (result1) {
  60. str_reset(segment);
  61. idx++;
  62. }
  63. pi(idx)
  64. str_new(ch);
  65. str_insert_char(ch, key[level]);
  66. if (ch.type & STR_TYPE_DIGIT) index = INT_TO_INDEX(key[level]);
  67. else if (ch.type & STR_TYPE_ALPHABETIC) index = CHAR_TO_INDEX(key[level]);
  68. str_free(ch)
  69. if (!pCrawl->children[index]) {
  70. index = CHAR_TO_INDEX('x');
  71. if (!pCrawl->children[index]) return false;
  72. }
  73. pCrawl = pCrawl->children[index];
  74. }
  75. str_free(segment);
  76. return (pCrawl != NULL && pCrawl->isEndOfWord);
  77. }
  78.