@@ -21,7 +21,7 @@ class SuffixTree
2121{
2222public:
2323// active point is initialized as (root, None, 0), remainder initialized as 1
24- SuffixTree (string str):test_str(str), root(test_str), active_point(&root, 0 , 0 ), remainder(0 ), pos(0 ), ls() {}
24+ SuffixTree (string str):test_str(str), root(test_str), active_point(&root, NULL , 0 ), remainder(0 ), pos( 0 ), base_pos (0 ), ls() {}
2525int construct (void );
2626
2727// return -1 if no such sub exist, return the beginning postion of this substring in thr original string if it exist
@@ -94,7 +94,7 @@ class SuffixTree
9494begin = b;
9595end = e;
9696endpoint = NULL ;
97- // std::cout << "Edge initialized" << std::endl;
97+ std::cout << " Edge initialized" << std::endl;
9898}
9999
100100void change_edge (unsigned int b, unsigned int e)
@@ -167,7 +167,7 @@ class SuffixTree
167167make_pair (edge, true );
168168edges.insert (make_pair (edge, true ));
169169findedges.insert (make_pair (test_node_str[edge->begin ], edge));
170- // cout << "edge added. Now we have " << edges.size() << "edges." << endl;
170+ cout << " edge added. Now we have " << edges.size () << " edges." << endl;
171171}
172172
173173void del_edge (Edge* edge) {
@@ -178,23 +178,28 @@ class SuffixTree
178178else {
179179// note we should erase the findedges too
180180edges.erase (edge);
181- // cout << "delete" << (*edge)[0] << endl;
181+ cout << " delete" << (*edge)[0 ] << endl;
182182findedges.erase ((*edge)[0 ]);
183- // cout << "edge deleted. Now we have " << edges.size() << "edges." << endl;
183+ cout << " edge deleted. Now we have " << edges.size () << " edges." << endl;
184184}
185185
186186}
187187
188188// find edge by the first char
189189Edge* find_edge (char c)
190190{
191- // cout << "finding edge" ;
191+ cout << " finding edge char " << c ;
192192map<char , Edge*>::iterator iter = findedges.find (c);
193- // cout << "founded?" << endl;
194- if (iter != findedges.end ())
193+ cout << " founded? " ;
194+
195+ if (iter != findedges.end ()) {
196+ cout << " yes." << endl;
195197return iter->second ;
196- else
198+ }
199+ else {
200+ cout << " no." << endl;
197201return NULL ;
202+ }
198203}
199204
200205bool isleaf () { return edges.empty (); }
@@ -224,10 +229,10 @@ class SuffixTree
224229class ActivePoint {
225230public:
226231Node* active_node;
227- char active_edge;
232+ Edge* active_edge;
228233int active_length;
229234
230- ActivePoint (Node* node, char edge, int length):
235+ ActivePoint (Node* node, Edge* edge, int length):
231236active_node (node), active_edge(edge), active_length(length) { std::cout << " ActivePoint initialized" << std::endl; }
232237};
233238
@@ -236,8 +241,8 @@ class SuffixTree
236241
237242Node* get_active_node (void ) { return active_point.active_node ; }
238243void set_active_node (Node* node) { active_point.active_node = node; cout << " Active node set as " << node << endl; }
239- char get_active_edge (void ) { return active_point.active_edge ; }
240- void set_active_edge (char edge) { active_point.active_edge = edge; }
244+ Edge* get_active_edge (void ) { return active_point.active_edge ; }
245+ void set_active_edge (Edge* edge) { active_point.active_edge = edge; }
241246int get_active_length (void ) { return active_point.active_length ; }
242247void set_active_length (int len) { active_point.active_length = len; }
243248void inc_active_len () { active_point.active_length ++; }
@@ -247,6 +252,7 @@ class SuffixTree
247252int remainder;
248253// how many characters inserted?
249254unsigned int pos;
255+ unsigned int base_pos;// the beginnig position of suffixes need to be inserted
250256char get_ele (int i) { return test_str[i]; }
251257// insert a char from pos to suffix tree
252258int insert ();
@@ -258,21 +264,32 @@ class SuffixTree
258264Node* seperate_edge (Node * node, Edge* edge, int rule);
259265
260266// check if we can change active node
261- void check_an (void )
267+ void check_active_node (void )
262268{
263269Node* node = get_active_node ();
264- Edge* edge = node-> find_edge ( get_active_edge () );
270+ Edge* edge = get_active_edge ();
265271
266272if (edge == NULL )
267273return ;
268274
269- int edge_size = edge->end - edge->begin + 1 ;
275+ unsigned int edge_size = edge->end - edge->begin + 1 ;
276+ unsigned int length = get_active_length ();
270277
271278// update
272- if (edge_size == get_active_length () ) {
279+ if (edge_size == length ) {
273280set_active_node (edge->endpoint );
274281set_active_edge (0 );
275282set_active_length (0 );
283+ base_pos += edge_size;
284+ }
285+ else if (length > edge_size) {
286+ set_active_length (length-edge_size);
287+ set_active_node (edge->endpoint );
288+ int new_length = get_active_length ();
289+ base_pos += edge_size;
290+ Edge *new_active_edge = edge->endpoint ->find_edge (get_ele (base_pos));
291+ set_active_edge (new_active_edge);
292+ check_active_node ();
276293}
277294}
278295
@@ -292,7 +309,7 @@ class SuffixTree
292309prev = curr;
293310curr = node;
294311
295- if (! first) {
312+ if (first == false ) {
296313prev->suffix_link = curr;
297314cout << " Suffix link added from prev " << prev << " to curr " << curr << endl;
298315}
0 commit comments