Задача
Имеются две строки $A$ и $B$.
Ваша задача — найти такую строку $C$, которая содержит в себе и $A$ и $B$ в качестве подстрок и является кратчайшей среди всех таких возможных строк.
Подстрокой строки называется последовательно идущая подпоследовательность этой строки. Например, строка $kbtu$ является подстрокой строки $kbtu open$, но строка $fall$ подстрокой не является.
Входные данные
Первая строка содержит строку $A$ $(1 \leqslant |A| \leqslant 10^5)$.
Вторая строка содержит строку $B$ $(1 \leqslant |B| \leqslant 10^5)$.
Гарантируется, что обе строки содержат только строчные латинские буквы.
Выходные данные
Выведите одну строку $C$.
Тесты
№ | Входные данные | Выходные данные |
---|---|---|
1. | compressing single |
compressingle |
2. | can you |
canyou |
3. | compressiondoneright doner |
compressiondoneright |
4. | details tail |
details |
5. | essential code |
essentialcode |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> #include <string> using namespace std; int main() { int n, m, z; string a, b, c, d; cin>>a; // Вводим строку A cin>>b; // Вводим строку B d = b; // Строку B будем хранить в переменной d n = b.length(); // В переменной n храним длину строки B m = a.length(); // В переменной m храним длину строки A c = a.substr(m - n, n); // Создаём подстроку if(a.find(b) == EOF) // Ищем в строке A строку B { for (int i = 1; i<=n && b != c; i++) // Удаляем символы в конце первой строки и начале второй, пока они не будут равны { b.erase(n - i,1); c.erase(0, 1); } z = c.length(); // В переменной z храним длину подстроки d.erase(0,z); // Удаляем из строки B элементы подстроки cout << a + d; // Выводим такую строку, которая содержит в себе и A и B } else cout << a; // Выводим строку A return 0; } |
Решение
В данной задаче необходимо создать строку $C$, которая будет содержать в себе строки $A$ и $B$. Рассмотрим два варианта решения задачи. Первый – если строка $B$ полностью содержится в строке $A$, то выводим строку $A$. Второй – если строка $B$ содержится в $A$ частично или не содержится вообще, выводим строку $A$ $+$ элементы строки $B$, которых нет в $A$.
Для проверки, находится ли строка $B$ в $A$, воспользуемся функцией find(). Если попадаем в первый вариант решения задачи, то выводим $A$. Иначе, создаём цикл, который будет удалять символы в конце первой строки и символы в начале второй, пока они не будут равны. Затем из строки $B$ удаляем элементы, которые входят в строку $A$, и на выход подаём строку $C$, которая состоит из строки $A$ и оставшихся элементов строки $B$.
Ссылки
- Условие задачи на e-olymp
- Код программы на ideone.com
- Засчитанное решение на e-olymp