Сбой при использовании ахорайного алгоритма?

Я получил код для алгоритма ахораксика здесь: http://www.komodia.com/aho-corasick.

Я использовал его, как сказал гид, добавил линии и построил дерево.

Однако я изменил его с использования std wstring на std string, но это не должно иметь значения. Я просто изменил typedef.

Когда я использую это и ищу что-то, если не найдены результаты, нет проблем. Когда результаты найдены, я получаю стандартное исключение из диапазона.

Это падает здесь:

        if (aIterator==pNode->aMap.end())
            //No, check if we have failure node
            if (!pNode->pFailureNode)
            {
                //No failure node, start at root again
                pNode=&m_aRoot;

                //Reset search string
                sMatchedString="";

                //Did we do a switch?
                if (bSwitch)
                    //We need to do this over
                    --iCount;

                //Exit this loop
                break;
            }
            else
            {
                //What is the depth difference?
                unsigned short usDepth;
                usDepth=pNode->usDepth-pNode->pFailureNode->usDepth-1;

                //This is how many chars to remove
                sMatchedString=sMatchedString.substr(usDepth,sMatchedString.length()-usDepth); //CRASHES HERE!!

                //Go to the failure node
                pNode=pNode->pFailureNode;

                //Set to switch
                bSwitch=true;
            }
        else
        {
            //Add the char
            sMatchedString+=rString[iCount];

            //Save the new node
            pNode=aIterator->second;

            //Exit the loop
            break;
        }
    }

Это падает здесь:

sMatchedString=sMatchedString.substr(usDepth,sMatchedString.length()-usDepth); 

Вот переменные:

Я использую это для реализации цензуры в игре.

Что может привести к его падению?

У меня есть несколько строк, добавленных дважды, это может вызвать проблемы?

Спасибо

1 ответ

Решение

Одна из вероятных проблем заключается в том, что sMatchedString является "u", в то время как usDepth равен 3. Это приводит к подстроке из третьего символа (в строке из одного символа) длиной -2.

Другие вопросы по тегам