Advertisement
Guest User

Untitled

a guest
Oct 30th, 2014
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. #include <boost/unordered_map.hpp>
  2. #include <boost/shared_ptr.hpp>
  3. #include <boost/make_shared.hpp>
  4.  
  5.  
  6.  
  7. class TrieVertex;
  8.  
  9. typedef boost::shared_ptr<TrieVertex> VertexPtr;
  10.  
  11. class TrieEdge
  12. {
  13. public:
  14. char fC;
  15. VertexPtr fTarget;
  16. TrieEdge(char c, VertexPtr target) : fC(c), fTarget(target) {}
  17. };
  18.  
  19. typedef boost::shared_ptr<TrieEdge> EdgePtr;
  20.  
  21.  
  22. class TrieVertex {
  23. public:
  24. boost::unordered_map<char, EdgePtr> fOutEdges;
  25. TrieVertex() : fOutEdges() {}
  26. };
  27.  
  28.  
  29.  
  30. class ReverseTrie {
  31. private:
  32. VertexPtr fRoot;
  33. size_t fSize;
  34.  
  35. public:
  36. ReverseTrie( ): fRoot(boost::make_shared<TrieVertex>()), fSize(0) {}
  37.  
  38. ~ReverseTrie() {
  39. fRoot.reset();
  40. }
  41.  
  42. void clear() {
  43. boost::make_shared<TrieVertex>().swap(fRoot);
  44. fSize = 0;
  45. }
  46.  
  47. size_t size() {
  48. return fSize;
  49. }
  50.  
  51. bool insertStringR(const std::string &word) {
  52. VertexPtr currentVertex = fRoot;
  53.  
  54. for (std::string::const_reverse_iterator i = word.rbegin(); i != word.rend(); ++i) {
  55. if (*i == '') {
  56. continue;
  57. }
  58. if (currentVertex->fOutEdges.size() == 0 || currentVertex->fOutEdges.count(*i) == 0) {
  59. VertexPtr targetVertex = boost::make_shared<TrieVertex>();
  60. EdgePtr e = boost::make_shared<TrieEdge>(*i, targetVertex);
  61. currentVertex->fOutEdges[*i] = e;
  62. currentVertex = e->fTarget;//*currentVertex.fOutEdges[*i]->fTarget;
  63. } else {
  64. EdgePtr e = currentVertex->fOutEdges[*i];
  65. currentVertex = e->fTarget;
  66. }
  67. }
  68. bool exists = true;
  69. //end of word.
  70. if (currentVertex->fOutEdges.count('') == 0) {
  71. VertexPtr targetVertex = boost::make_shared<TrieVertex>();
  72. EdgePtr e = boost::make_shared<TrieEdge>('', targetVertex);
  73. currentVertex->fOutEdges[''] = e;
  74. exists = false;
  75. }
  76. fSize++;
  77. return exists;
  78. }
  79.  
  80. bool containsString(const std::string &word) {
  81. VertexPtr currentVertex = fRoot;
  82. for (std::string::const_reverse_iterator i = word.rbegin(); i != word.rend(); ++i) {
  83. if (*i == '') {
  84. continue;
  85. }
  86. if (currentVertex->fOutEdges.size() == 0 || currentVertex->fOutEdges.count(*i) == 0) {
  87. return false;
  88. } else {
  89. currentVertex = currentVertex->fOutEdges[*i]->fTarget;
  90. }
  91. }
  92. if (currentVertex->fOutEdges.count('') == 0) {
  93. return false;
  94. }
  95. return true;
  96. }
  97.  
  98. void logEdges(VertexPtr vp) {
  99. for ( boost::unordered_map<char, EdgePtr>::iterator it = vp->fOutEdges.begin(); it != vp->fOutEdges.end(); it++) {
  100. char c = it->first;
  101. EdgePtr ep = it->second;
  102. std::string output;
  103. if (c == '')
  104. output.append("EOW");
  105. else
  106. output.push_back(c);
  107. logWarning("---", "edge: %s", output.c_str());
  108. logEdges(ep->fTarget);
  109. }
  110. }
  111.  
  112. void logEdges() {
  113. logEdges(fRoot);
  114. }
  115. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement