#include <iostream>
#include <algorithm>
int main(){
std::string word1;
std::string word2;
int i;
int j;
bool flag = true;
bool flag1 = false;
bool flag2 = false;
bool flag3 = false;
bool flag4 = false;
bool flag5 = false;
std::string rez = "";
//ввод первого слова
while (true){
std::cout << "Введите первое слово, состоящее из букв 'а', 'г', 'ц', 'т' : ";
std::cin >> word1;
std::cout << word1 << std::endl;
for (i = 0; i < word1.length(); i++)
if (word1[i] == 'a' || word1[i] == 'r' || word1[i] == 'c' || word1[i] == 't'|| word1[i] == '\0')
flag1 = true;
else
flag1 = false;
if (flag1 == true) break;
}
//ввод второго слова
while (true){
std::cout << "Введите второе слово, состоящее из букв 'а', 'г', 'ц', 'т' : ";
std::cin >> word2;
std::cout << word2 << std::endl;
for (i = 0; i < word2.length(); i++)
if (word2[i] == 'a' || word2[i] == 'r' || word2[i] == 'c' || word2[i] == 't')
flag2 = true;
else
flag2 = false;
if (flag2 == true) break;
}
int n = word1.length();
int m = word2.length();
int A[m][n];
int W[m][n];
//заполнение нулями и вывод массива А, если буквы не совпали
//и единицами на пересечениях совпавших букв
std::cout << std::endl;
for (j = 0; j < n; j++)
std::cout << "{0} " << word1[j];
std::cout << std::endl;
for (i = 0; i < m; i++){
std::cout << "{0} " << word2[i];
for (j = 0; j < n; j++){
if (word1[j] == word2[i]){
A[i][j] = 1;
std::cout << "1 ";
}
else {
A[i][j] = 0;
std::cout << "0 ";
}}
std::cout << std::endl;
}
//заполнение массива W:
//заполнение первой строки
for (j = 0; j < n; j++){
if (flag3 == true || A[0][j] == 1){
W[0][j] = 1;
flag3 = true;
}else
W[0][j] = 0;
}
// заполнение первого столбца
for (i = 0; i < m; i++){
if (flag4 == true || A[i][0] == 1){
W[i][0] = 1;
flag4 = true;
}else
W[i][0] = 0;
}
//дальнейшее заполнение
for (i = 1; i < m; i++)
for (j = 1; j < n; j++){
if (A[i][j] == 0)
if(W[i - 1][j] > W[i][j -1])
W[i][j] = W[i - 1][j];
else
W[i][j] = W[i][j -1];
else
W[i][j] = W[i - 1][j - 1] + 1;
}
//вывод матрицы W
std::cout << std::endl;
for (j = 0; j < n; j++)
std::cout << "{0} " << word1[j];
std::cout << std::endl;
for (i = 0; i < m; i++){
std::cout << "{0} " << word2[j];
for (j = 0; j < n; j++)
std::cout << "{0} " << W[i][j];
std::cout << std::endl;
}
//поиск цепочки
int lon = 0; //длина максимальной цепочки
int lonx = 0; //координаты максимальной закрашенной буквы i
int lony = 0;//координаты максимальной закрашенной буквы j
for (i = m - 1; i > 0; i--){
for (j = n - 1; j > 0; j--){
if (A[i][j] == 1){
lon = W[i][j];
flag5 = true;
lonx = i;
lony = j;
break;
}
}
if (flag5) break;
}
std::cout << "Максимальная цепочка длиной {0}: " << lon << std::endl;
rez += word2[lonx];
for (int k = 0; k < lon - 1; k++){
if (A[lonx - 1][lony - 1] == 1){
lonx--;
lony--;
//rez += Convert.ToString(word2[lonx]);
continue;
}else
for (i = lonx; i > lonx - 3 && flag; i--)
for (j = lony; j > lony - 3 && flag; j--)
if (i != lonx || j != lony)
if (A[i][j] == 1){
lonx = i;
lony = j;
flag = false;
}
rez += word2[lonx];
flag = true;
}
std::reverse(rez.begin(),rez.end());
std::cout << "Максимальная подпоследователность:" << rez;
}