2013-10-07 3 views
1

У меня есть суффикс дерево, каждый узел этого дерева является структуройглубины первого поиск

struct state { 
int len, link; 
map<char,int> next; }; 
state[100000] st; 

мне нужно сделать для каждой глубину узла и получить все строки, которые я могу достичь, но я не умеют делать. Это мой ДФС функционировать

void getNext(int node){ 
    for(map<char,int>::iterator it = st[node].next.begin();it != st[node].next.end();it++){ 
     getNext(it->second); 
} 
} 

Это будет идеально, если я могу сделать что-то вроде

map<int,vector<string> > 

где ИНТ узел моих дерева и вектора строк, которые я могу достичь

прямо сейчас он работает

void createSuffices(int node){//, map<int, vector<string> > &suffices) { 
if (suffices[sz - 1].size() == 0 && (node == sz - 1)) { 
    // node is a leaf 
    // add a vector for this node containing just 
    // one element: the empty string 
    //suffices[node] = new vector<string> 
    //suffices.add(node, new vector<string>({""})); 
    vector<string> r; 
    r.push_back(string()); 
    suffices[node] = r; 
} else { 
    // node is not a leaf 
    // create the vector that will be built up 
    vector<string> v; 
    // loop over each child 
    for(map<char,int>::iterator it = st[node].next.begin();it != st[node].next.end();it++){ 
     createSuffices(it->second); 
     vector<string> t = suffices[it->second]; 
     for(int i = 0; i < t.size(); i ++){ 
      v.push_back(string(1,it->first) + t[i]); 
     } 
    } 
    suffices[node] = v; 
} 
} 
+0

Зачем использовать карту, вы хотите, чтобы это для каждого узла так просто сделать вектор векторных указателей. В любом случае у вас будет довольно много избыточности. – Leeor

+0

Я считаю, что проверка на лист неправильная. Узел - это лист, если у него нет детей, то есть если 'next' является пустой картой. Я не знаю, что 'sz' находится в фрагменте выше, но кажется неправильным. –

ответ

0

Вы можете передать map<int, vector<string>> ее с вашей глубиной первого поиска. Когда рекурсивный вызов возвращается с определенного узла n, вы знаете, что все из этого узла готовы. Мои C++ навыки слишком ограничены, так что я буду писать в псевдокоде:

void createSuffices(int node, map<int, vector<string>> suffices) { 
    if (st[node].next.empty()) { 
     // node is a leaf 
     // add a vector for this node containing just 
     // one element: the empty string 
     suffices.add(node, new vector<string>({""})); 
    } else { 
     // node is not a leaf 
     // create the vector that will be built up 
     vector<string> v; 
     // loop over each child 
     foreach pair<char, int> p in st[node].next { 
      // handle the child 
      createSuffices(p.second, suffices); 

      // prepend the character to all suffices of the child 
      foreach string suffix in suffices(p.second) { 
       v.add(concatenate(p.first, suffix)); 
      }     
     } 
     // add the created vector to the suffix map 
     suffices.add(node, v); 
    } 
} 
+0

как я вижу, есть некоторые проблемы, достаточно empry каждый раз –

+0

Нужно ли нам ref, а не val, если мы хотим изменить достаточно: 'map > & хватает – doctorlove

+0

@doctorlove да, абсолютно. Я попытался записать его на C++ ish (со ссылками), но я застрял, поэтому решил написать его так просто, как только мог ... но действительно, карта * должна быть передана по ссылке или это выиграло ' т работы. –

Смежные вопросы