//============================================================================
// Name : 1934.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <set>
#define ATOZ 26
#define MAX_L 81
using namespace std;
int lasta[MAX_L][ATOZ];
int lastb[MAX_L][ATOZ];
set<string> out;
int res[MAX_L][MAX_L];
char save[MAX_L];
void find(int m, int n, int len) {
if (len <= 0) {
out.insert(save);
return;
}
if (m > 0 && n > 0) {
for (int i = 0; i < 26; i++) {
int p1 = lasta[m][i];
int p2 = lastb[n][i];
if (res[p1][p2] == len) {
save[len-1] = 'a' + i;
find(p1 - 1, p2 - 1, len - 1);
}
}
}
}
int main() {
ios::sync_with_stdio(false);
string a, b;
cin >> a >> b;
int m = a.length() + 1;
int n = b.length() + 1;
for (int i = 0; i < m; i++) {
res[i][0] = 0;
}
for (int i = 0; i < n; i++) {
res[0][i] = 0;
}
for (int i = 1; i < m; i++)
for (int j = 1; j < n; j++) {
if (a[i - 1] == b[j - 1]) {
res[i][j] = res[i - 1][j - 1] + 1;
} else {
res[i][j] = max(res[i - 1][j], res[i][j - 1]);
}
}
for (int i = 0; i < m; i++)
for (int j = 0; j < ATOZ; j++) {
if (i == 0)
lasta[i][j] = 0;
else if (a[i - 1] == j + 'a')
lasta[i][j] = i;
else
lasta[i][j] = lasta[i - 1][j];
}
for (int i = 0; i < n; i++)
for (int j = 0; j < ATOZ; j++) {
if (i == 0)
lastb[i][j] = 0;
else if (b[i - 1] == j + 'a')
lastb[i][j] = i;
else
lastb[i][j] = lastb[i - 1][j];
}
int len = res[m - 1][n - 1];
save[len] = '\0';
find(m - 1, n - 1, len);
for (set<string>::iterator it = out.begin(); it != out.end(); it++) {
cout << *it << endl;
}
return 0;
}
poj1934
最新推荐文章于 2022-02-17 15:08:40 发布