LCS+一维
KMP构造转移+记忆化搜索。。。。
/**
* Created by ckboss on 14-9-4.
*/
import java.util.*;
public class LuckyCommonSubsequence {
static String s1, s2, virus;
static int[][][] dp = new int[200][200][200];
static int[][] ch = new int[200][30];
static int[] fail = new int[200];
static int n, x, y;
static boolean[][][] vis = new boolean[200][200][200];
static void init() {
fail[0] = fail[1] = 0;
for (int i = 1; i < n; i++) {
int j = fail[i];
while (j != 0 && virus.charAt(i) != virus.charAt(j)) j = fail[j];
fail[i + 1] = (virus.charAt(i) == virus.charAt(j)) ? j + 1 : 0;
}
for (int i = 0; i < n; i++) ch[i][virus.charAt(i) - 'A'] = i + 1;
for (int i = 0; i < n; i++) {
for (int c = 0; c < 26; c++) {
if (ch[i][c] == 0)
ch[i][c] = ch[fail[i]][c];
}
}
}
static int dfs(int i, int j, int k) {
if (vis[i][j][k] == true)
return dp[i][j][k];
vis[i][j][k] = true;
if (k >= n)
return dp[i][j][k] = -999999999;
if (i >= x || j >= y)
return dp[i][j][k] = 0;
dp[i][j][k] = Math.max(dfs(i + 1, j, k), dfs(i, j + 1, k));
if (s1.charAt(i) == s2.charAt(j)) {
dp[i][j][k] = Math.max(dp[i][j][k], dfs(i + 1, j + 1, ch[k][s1.charAt(i) - 'A']) + 1);
}
return dp[i][j][k];
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
s1 = in.next().trim();
s2 = in.next().trim();
virus = in.next().trim();
x = s1.length();
y = s2.length();
n = virus.length();
init();
if (dfs(0, 0, 0) != 0) {
int i = 0, j = 0, k = 0;
String ans = "";
while (i < x && j < y) {
if (dfs(i, j, k) == dfs(i + 1, j, k))
i++;
else if (dfs(i, j, k) == dfs(i, j + 1, k))
j++;
else {
ans += s1.charAt(i);
k = ch[k][s1.charAt(i) - 'A'];
i++;
j++;
}
}
System.out.println(ans);
} else {
System.out.println("0");
}
}
}