aydarbiktimirov

Untitled

Mar 29th, 2012
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.84 KB | None | 0 0
  1. void CSuffixTree::Print(std::ostream& os, char nullchar) const
  2. {
  3.     std::vector<CNode*> nodes;
  4.     std::vector<CEdge*> edges;
  5.     std::vector<std::pair<CNode*, CNode*> > suffix_links;
  6.  
  7.     CNode* root = pseudo_edge->head->edges[0]->head;
  8.     CEdge* joker = root->link;
  9.     root->link = 0; // не выводить джокер
  10.  
  11.     DFS(root, nodes, edges, suffix_links);
  12.  
  13.     root->link = joker; // вернуть джокер
  14.  
  15.     os << "digraph {" << std::endl;
  16.     os << "\tnode" << nodes[0] << " [ shape = doublecircle ]" << std::endl;
  17.     for(size_t i = 1; i < nodes.size(); ++i) {
  18.         os << "\tnode" << nodes[i] << " [ shape = " << (nodes[i]->edges.empty() ? "box" : "ellipse") << ", fontsize = 10 ]" << std::endl;
  19.     }
  20.     std::string str = string;
  21.     str[string.length() - 1] = nullchar;
  22.     for(size_t i = 0; i < edges.size(); ++i) {
  23.         os << "\tnode" << edges[i]->tail << " -> node" << edges[i]->head << " [ label = \"";
  24.         for(size_t j = edges[i]->start; j < std::min(edges[i]->end, str.length()); ++j) {
  25.             if(str[j] == '"' || str[j] == '\\') {
  26.                 os << '\\';
  27.             }
  28.             os << str[j];
  29.         }
  30.         os << "\", fontsize = 10, size = \"5.0,8.0\" ]" << std::endl;
  31.     }
  32.     for(size_t i = 0; i < suffix_links.size(); ++i) {
  33.         os << "\tnode" << suffix_links[i].first << " -> node" << suffix_links[i].second << " [ style = \"dashed\" ]" << std::endl;
  34.     }
  35.     os << "}";
  36. }
  37.  
  38. void CSuffixTree::DFS(CSuffixTree::CNode* node, std::vector<CSuffixTree::CNode*>& nodes, std::vector<CSuffixTree::CEdge*>& edges, std::vector<std::pair<CSuffixTree::CNode*, CSuffixTree::CNode*> >& suffix_links) const
  39. {
  40.     nodes.push_back(node);
  41.  
  42.     if(node->link != 0) {
  43.         suffix_links.push_back(std::make_pair(node, node->link->head));
  44.     }
  45.  
  46.     for(std::map<char, CEdge*>::iterator it = node->edges.begin(); it != node->edges.end(); ++it) {
  47.         edges.push_back(it->second);
  48.         DFS(it->second->head, nodes, edges, suffix_links);
  49.     }
  50. }
Advertisement
Add Comment
Please, Sign In to add comment