598{
599 auto tmpNode =
mRoot;
600 auto tmpLabel = w;
601 auto match =
findMatch(tmpNode,tmpLabel);
602 auto f = std::get<0>(match);
603 auto pre = std::get<1>(match);
604 int patternNum = -1;
605 while (f != nullptr && pre == Word(f->arcLabel()))
606 {
607
608
609 tmpNode = f;
610 tmpLabel =
suffix(tmpLabel,pre.size());
611
612
613 for (auto i = tmpNode->childrenBegin(); i != tmpNode->childrenEnd(); ++i)
614 {
615 if (i->second->isLeaf() && !i->second->isFullPattern())
616 {
617 patternNum = i->second->getPatternNumber();
618 if (!(avoidLast && patternNum ==
mMonomials.size()-1))
619 output.push_back(std::make_pair(patternNum,
620 mMonomials[patternNum].size()-tmpNode->label().size()));
621 }
622 }
624 f = std::get<0>(match);
625 pre = std::get<1>(match);
626 }
627
628
629
630
631 if (pre.size() != 0 && !f->isFullPattern())
632 {
633 patternNum = f->getPatternNumber();
634 if (!(avoidLast && patternNum ==
mMonomials.size()-1))
635 output.push_back(std::make_pair(patternNum,
mMonomials[patternNum].size()-pre.size()));
636 }
637 return;
638}
Word suffix(const Word vec, int indexOfSuffix)
auto findMatch(SuffixTreeNode *y, const Word &s) const -> ExtendedLocusType
std::vector< Label > mMonomials