@@ -21,7 +21,7 @@ class SuffixTree
21
21
{
22
22
public:
23
23
// 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() {}
25
25
int construct (void );
26
26
27
27
// 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
94
94
begin = b;
95
95
end = e;
96
96
endpoint = NULL ;
97
- // std::cout << "Edge initialized" << std::endl;
97
+ std::cout << " Edge initialized" << std::endl;
98
98
}
99
99
100
100
void change_edge (unsigned int b, unsigned int e)
@@ -167,7 +167,7 @@ class SuffixTree
167
167
make_pair (edge, true );
168
168
edges.insert (make_pair (edge, true ));
169
169
findedges.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;
171
171
}
172
172
173
173
void del_edge (Edge* edge) {
@@ -178,23 +178,28 @@ class SuffixTree
178
178
else {
179
179
// note we should erase the findedges too
180
180
edges.erase (edge);
181
- // cout << "delete" << (*edge)[0] << endl;
181
+ cout << " delete" << (*edge)[0 ] << endl;
182
182
findedges.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;
184
184
}
185
185
186
186
}
187
187
188
188
// find edge by the first char
189
189
Edge* find_edge (char c)
190
190
{
191
- // cout << "finding edge" ;
191
+ cout << " finding edge char " << c ;
192
192
map<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;
195
197
return iter->second ;
196
- else
198
+ }
199
+ else {
200
+ cout << " no." << endl;
197
201
return NULL ;
202
+ }
198
203
}
199
204
200
205
bool isleaf () { return edges.empty (); }
@@ -224,10 +229,10 @@ class SuffixTree
224
229
class ActivePoint {
225
230
public:
226
231
Node* active_node;
227
- char active_edge;
232
+ Edge* active_edge;
228
233
int active_length;
229
234
230
- ActivePoint (Node* node, char edge, int length):
235
+ ActivePoint (Node* node, Edge* edge, int length):
231
236
active_node (node), active_edge(edge), active_length(length) { std::cout << " ActivePoint initialized" << std::endl; }
232
237
};
233
238
@@ -236,8 +241,8 @@ class SuffixTree
236
241
237
242
Node* get_active_node (void ) { return active_point.active_node ; }
238
243
void 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; }
241
246
int get_active_length (void ) { return active_point.active_length ; }
242
247
void set_active_length (int len) { active_point.active_length = len; }
243
248
void inc_active_len () { active_point.active_length ++; }
@@ -247,6 +252,7 @@ class SuffixTree
247
252
int remainder;
248
253
// how many characters inserted?
249
254
unsigned int pos;
255
+ unsigned int base_pos; // the beginnig position of suffixes need to be inserted
250
256
char get_ele (int i) { return test_str[i]; }
251
257
// insert a char from pos to suffix tree
252
258
int insert ();
@@ -258,21 +264,32 @@ class SuffixTree
258
264
Node* seperate_edge (Node * node, Edge* edge, int rule);
259
265
260
266
// check if we can change active node
261
- void check_an (void )
267
+ void check_active_node (void )
262
268
{
263
269
Node* node = get_active_node ();
264
- Edge* edge = node-> find_edge ( get_active_edge () );
270
+ Edge* edge = get_active_edge ();
265
271
266
272
if (edge == NULL )
267
273
return ;
268
274
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 ();
270
277
271
278
// update
272
- if (edge_size == get_active_length () ) {
279
+ if (edge_size == length ) {
273
280
set_active_node (edge->endpoint );
274
281
set_active_edge (0 );
275
282
set_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 ();
276
293
}
277
294
}
278
295
@@ -292,7 +309,7 @@ class SuffixTree
292
309
prev = curr;
293
310
curr = node;
294
311
295
- if (! first) {
312
+ if (first == false ) {
296
313
prev->suffix_link = curr;
297
314
cout << " Suffix link added from prev " << prev << " to curr " << curr << endl;
298
315
}
0 commit comments