Разбор Подпись 1
21 апр
В силу небольших ограничений на длину строк мы можем перебрать всевозможные варианты соединений, которые могут быть получены из данных имен. Сделаем это следующим образом: будем убирать по одному символу справа из первого имени и приписывать к нему второе, при этом каждый раз будем проверять: начинается ли образующаяся таким образом строка с первого имени, если это так, то данная строка удовлетворяет необходимому условию (заканчиваться она будет вторым имененем по построению). При встрече очередной строки, начинающейся и заканчивающейся нашими именами, будем сравнивать ее с ранее найденной, на текущий момент самой короткой. Если текущая окажется короче, то ее следует запомнить. После перебора всех вариантов сокращения первой строки следует поменять строки местами, для чего удобно описать отдельную функцию search(a,b) , которая будет сокращать первую строку, припысывая вторую. Следует так же отметить, что в процессе сравнения нужно преобразовывать все символы либо в верхний, либо в нижний регистр. В начале в качестве самой короткой строки можно считать строку, состоящую из суммы исходных имен, которая очевидно обладает необходимым свойством. По завершению поиска в качестве ответа просто останется вывести ту строку, в которой мы хранили текущий наикратчайший вариант.
Алгоритмическая реализация вышеописанной идеи:
String a,b,m,s;
void search(a,b){
for i=len(a)..0{
s = a[1..i]+b;
if ((len(lm)>len(ls) or len(lm)=len(ls) and m>s) and lower(a)=lower(left(s,len(a)))) m=s;
}
}
read(a,b);
m=a+b;
search(a,b);
search(b,a);
write(m);
Discussion: