я использую эта программа для вычисления массива суффиксов и самого длинного общего префикса.
Мне необходимо вычислить самую длинную общую подстроку между двумя строками.
Для этого я объединяю строки, 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];
}
}
}
AFAIK, Эта проблема из соревнования по программированию, и обсуждать проблемы программирования в текущем конкурсе до того, как редакционные статьи не будут выпущены … Хотя я даю вам некоторые идеи, как я получил Неправильный ответ с суффиксным массивом. Тогда я использовал суффикс автомат что дает мне принято.
Суффиксный массив работает в 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"
А также справиться с ограничением …первая самая длинная общая подстрока, найденная во второй строке, должна быть записана для вывода … было бы очень легко в случае суффиксного автомата. Удачи!
Других решений пока нет …