Реализация самой длинной общей подстроки с использованием суффиксного массива

Я использую эту программу для вычисления массива суффиксов и самого длинного общего префикса.

Мне необходимо вычислить самую длинную общую подстроку между двумя строками.

Для этого я объединяю строки, A#B а затем использовать этот алгоритм.

У меня есть Суффикс Массив sa[] и LCP[] массив.

Самая длинная общая подстрока - это максимальное значение LCP[] массив.

Чтобы найти подстроку, единственное условие состоит в том, что среди подстрок общей длины, ответ, встречающийся впервые в строке B, должен быть ответом.

Для этого я поддерживаю максимум LCP[]. Если LCP[curr_index] == maxтогда я убедился, что left_index подстроки B меньше, чем предыдущее значение left_index,

Однако такой подход не дает правильного ответа. Где вина?

max=-1;
for(int i=1;i<strlen(S)-1;++i)
{
    //checking that sa[i+1] occurs after s[i] or not
    if(lcp[i] >= max && sa[i] < l1 && sa[i+1] >= l1+1 )
    {
        if( max == lcp[i] && sa[i+1] < left_index ) left_index=sa[i+1];

        else if (lcp[i] > ma )
        {
            left_index=sa[i+1];
            max=lcp[i];
        }
    }
    //checking that sa[i+1] occurs after s[i] or not
    else if (lcp[i] >= max && sa[i] >= l1+1 && sa[i+1] < l1 )
    {
        if( max == lcp[i] && sa[i] < left_index) left_index=sa[i];

        else if (lcp[i]>ma)
        {
            left_index=sa[i];
            max=lcp[i];
        }
    }
}

1 ответ

AFAIK, Эта проблема из соревнования по программированию, и обсуждать проблемы программирования в текущем конкурсе до того, как редакционные статьи не будут выпущены... Хотя я даю вам некоторые идеи, поскольку я получил неправильный ответ с суффиксным массивом. Затем я использовал суффикс Automaton, который дает мне Accepted.

Суффиксный массив работает в O(nlog^2 n) в то время как Suffix Automaton работает в O(n), Поэтому мой совет: используйте суффикс Automaton, и вы обязательно получите Accepted. И если вы можете написать решение для этой проблемы, вы наверняка закодируете это.

Также найдено на форуме codchef, что:

Try this case 
babaazzzzyy 
badyybac 
The suffix array will contain baa... (From 1st string ) , baba.. ( from first string ) , bac ( from second string ) , bad from second string .
So if you are examining consecutive entries of SA then you will find a match at "baba" and "bac" and find the index of "ba" as 7 in second string , even though its actually at index 1 also . 
Its likely that you may output "yy" instead of "ba"

А также обработка ограничения ... первая самая длинная общая подстрока, найденная во второй строке, должна быть записана в выходной файл... было бы очень легко в случае суффиксного автомата. Удачи!

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