char* find_lcs(const char *a, int na, const char *b, int nb) { if (na > nb) { const char *c; int t; c = a, a = b, b = c; t = na, na = nb, nb = t; } if (na == 0) return alloc_str(1); if (na == 1) { for (int i = 0; i < nb; i++) { if (a[0] == b[i]) return substr(a, 0, 1); } return alloc_str(1); } static int t1[MAXN]; static int t2[MAXN]; int len = lcs_len(a, na, b, nb, t1); if (len == 0) return alloc_str(1); int half_len = na / 2; char *la = substr(a, 0, half_len); char *ra = substr(a, half_len, na - half_len); char *tb = reverse(b, nb); char *ta = reverse(ra, na - half_len); lcs_len(la, half_len, b, nb, t1); lcs_len(ta, na - half_len, tb, nb, t2); int split = -1; for (int i = 0; i <= nb; i++) { if (t1[i] + t2[nb-i] == len) { split = i; break; } } char *lb = substr(b, 0, split); char *rb = substr(b, split, nb - split); char *sl = find_lcs(la, half_len, lb, split); char *sr = find_lcs(ra, na - half_len, rb, nb - split); char *ret = cat(sl, sr); free(la), free(ra), free(ta); free(lb), free(rb), free(tb); free(sl), free(sr); return ret; }
/*测试程序*/ int main() { scanf("%s%s",a,b); printf("%d\n",lcs_len(a,b,c)); return 0; }
int main() { int dp[MAXN]; while (scanf("%s %s", A, B) == 2) { int len = lcs_len(A, strlen(A), B, strlen(B), dp); printf("%d\n", len); } return 0; }
int main() { static char A[MAXN], B[MAXN]; int dp[MAXN]; while (scanf("%s %s", A, B) == 2) { int na = strlen(A); int nb = strlen(B); int len = lcs_len(A, na, B, nb, dp); char *str = find_lcs(A, na, B, nb); printf("%d\n", len); printf("%s\n", str); free(str); } return 0; }
int main(int argc, char **argv) { if (argc != 3) { printf("Usage: %s file1 file2\n", argv[0]); return -1; } char *s = read_file(argv[1]); char *t = read_file(argv[2]); if (s == NULL || t == NULL) { printf("Could not open.\n"); return -2; } unsigned rv = lcs_len(s, t); printf("LCS: %d\n", rv); free(s); free(t); return 0; }