voidSuffixTree::CountIndex(Node*node,vector<int>&vec){if(!node)// конец рекурсии: пустое поддеревоreturn;for(autoit:node->children)// рекурсивный вызов для всех поддеревьевCountIndex(it.second,vec);if(node->suffix_index!=-1)// как дошли до листа, добавляем в вектор его индексvec.push_back(node->suffix_index);}voidSuffixTree::Search(string&pat,intpatNum){Node*current=root;// начинаем поиск из корняfor(autoit=pat.begin();it!=pat.end();)// итерируемся по паттерну, пока можем{autofind=current->children.find(*it);// исходит ли из текущей ноды дуга, начинающаяся символом *it?if(find!=current->children.end()){// если да, то перескочим на эту дугуcurrent=find->second;// и пробежим все ее символыfor(intj=current->start;j<=*current->end&&it!=pat.end();j++,++it){// мисмач - выходим из функции, паттерна в тексте нетif(text[j]!=*it)return;}}else// мисмач - выходим из функции, паттерна в тексте нетreturn;}vector<int>ind;// массив индексов листьевCountIndex(current,ind);// которые содержатся в поддереве с вершиной-корнем current, // в конце которой паттерн полностью поматчился с путевой меткой этой вершиныsort(ind.begin(),ind.end());cout<<patNum<<": "<<ind[0]+1;for(auto&pos:ind){if(pos==ind[0])continue;cout<<", "<<pos+1;}cout<<endl;}