#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define Max 3003 char t1[Max]; char t2[Max]; int Map[Max][Max]; int N, M, Q, q; struct Skip { int right; int bottom; bool isSkip; }; Skip Skips[Max][Max]; struct Mem { int q; int count; }; Mem Memory[Max][Max]; int max(int x, int y) { return x > y ? x : y; } void countSubSequence(char t1[], char t2[]) { for (int m = 0; m < M; m++) { for (int n = 0; n < N; n++) { if (t1[n] == t2[m]) { Map[n + 1][m + 1] = Map[n][m] + 1; Skips[n + 1][m + 1].isSkip = true; //printf("^%d ", Map[n + 1][m + 1]); } else { Map[n + 1][m + 1] = max(Map[n + 1][m], Map[n][m + 1]); //printf(" %d ", Map[n + 1][m + 1]); } } //printf("\n"); } //count skips horizontally for (int m = 0; m < M; m++) { int currentSkipTo = -1; for (int n = N - 1; n >= 0; n--) { if (Skips[n + 1][m + 1].isSkip) currentSkipTo = n + 1; else Skips[n + 1][m + 1].right = currentSkipTo; } } //count skips vertically for (int n = 0; n < N; n++) { int currentSkipTo = -1; for (int m = M - 1; m >= 0; m--) { if (Skips[n + 1][m + 1].isSkip) currentSkipTo = m + 1; else Skips[n + 1][m + 1].bottom = currentSkipTo; } } } int count(int f1, int t1, int f2, int t2) { if (f1 == -1 || f2 == -1) return 0; if (f1 > t1 || f2 > t2) return 0; if (Memory[f1][f2].q == q && Memory[f1][f2].count > 0) return Memory[f1][f2].count; if (Skips[f1][f2].isSkip) { int r = 1 + count(f1 + 1, t1, f2 + 1, t2); Memory[f1][f2].q = q; Memory[f1][f2].count = r; return r; } int r1 = count(Skips[f1][f2].right, t1, f2, t2); int r2 = count(f1, t1, Skips[f1][f2].bottom, t2); int r3 = count(f1 + 1, t1, f2 + 1, t2); int rMax = max(r1, max(r2, r3)); Memory[f1][f2].q = q; Memory[f1][f2].count = rMax; return rMax; } int main() { scanf("%d %d %d", &N, &M, &Q); for (int i = 0; i < N; i++) scanf(" %c", &t1[i]); t1[N] = 0; for (int i = 0; i < M; i++) scanf(" %c", &t2[i]); t2[M] = 0; countSubSequence(t1, t2); for (q = 0; q < Q; q++) { int f1, t1, f2, t2; scanf(" %d %d %d %d", &f1, &t1, &f2, &t2); printf("%d\n", count(f1, t1, f2, t2)); } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define Max 3003 char t1[Max]; char t2[Max]; int Map[Max][Max]; int N, M, Q, q; struct Skip { int right; int bottom; bool isSkip; }; Skip Skips[Max][Max]; struct Mem { int q; int count; }; Mem Memory[Max][Max]; int max(int x, int y) { return x > y ? x : y; } void countSubSequence(char t1[], char t2[]) { for (int m = 0; m < M; m++) { for (int n = 0; n < N; n++) { if (t1[n] == t2[m]) { Map[n + 1][m + 1] = Map[n][m] + 1; Skips[n + 1][m + 1].isSkip = true; //printf("^%d ", Map[n + 1][m + 1]); } else { Map[n + 1][m + 1] = max(Map[n + 1][m], Map[n][m + 1]); //printf(" %d ", Map[n + 1][m + 1]); } } //printf("\n"); } //count skips horizontally for (int m = 0; m < M; m++) { int currentSkipTo = -1; for (int n = N - 1; n >= 0; n--) { if (Skips[n + 1][m + 1].isSkip) currentSkipTo = n + 1; else Skips[n + 1][m + 1].right = currentSkipTo; } } //count skips vertically for (int n = 0; n < N; n++) { int currentSkipTo = -1; for (int m = M - 1; m >= 0; m--) { if (Skips[n + 1][m + 1].isSkip) currentSkipTo = m + 1; else Skips[n + 1][m + 1].bottom = currentSkipTo; } } } int count(int f1, int t1, int f2, int t2) { if (f1 == -1 || f2 == -1) return 0; if (f1 > t1 || f2 > t2) return 0; if (Memory[f1][f2].q == q && Memory[f1][f2].count > 0) return Memory[f1][f2].count; if (Skips[f1][f2].isSkip) { int r = 1 + count(f1 + 1, t1, f2 + 1, t2); Memory[f1][f2].q = q; Memory[f1][f2].count = r; return r; } int r1 = count(Skips[f1][f2].right, t1, f2, t2); int r2 = count(f1, t1, Skips[f1][f2].bottom, t2); int r3 = count(f1 + 1, t1, f2 + 1, t2); int rMax = max(r1, max(r2, r3)); Memory[f1][f2].q = q; Memory[f1][f2].count = rMax; return rMax; } int main() { scanf("%d %d %d", &N, &M, &Q); for (int i = 0; i < N; i++) scanf(" %c", &t1[i]); t1[N] = 0; for (int i = 0; i < M; i++) scanf(" %c", &t2[i]); t2[M] = 0; countSubSequence(t1, t2); for (q = 0; q < Q; q++) { int f1, t1, f2, t2; scanf(" %d %d %d %d", &f1, &t1, &f2, &t2); printf("%d\n", count(f1, t1, f2, t2)); } return 0; } |