Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
/*测试程序*/
int	 main()
{

    scanf("%s%s",a,b);
    printf("%d\n",lcs_len(a,b,c));
    return 0;
}
Ejemplo n.º 3
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;
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
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;
}