/** * Prints the longest common subsequence of two * long long int arrays to standard out. Easily * modified to return it in an array instead. * Approximate runtime: O(M*N) * Approximate space: O(M+N) * */ void findLCS(long long int * A, int Abegin, int Aend, long long int * B, int Bbegin, int Bend){ int Alen = Aend - Abegin; if (Alen == 0){ return; } int Blen = Bend - Bbegin; long long int * newA = A; long long int * newB = B; newA += Abegin; newB += Bbegin; if ( Alen == 1){ int i = 0; for(i = 0; i < Blen; i++){ if(newA[0] == newB[i]){ //bingo, throw it to standard out printf("%lli ", newA[0]); break; } } return; } else { //Split A int AAbegin = Abegin; int ABbegin = Abegin + Alen/2; int AAend = Abegin + Alen/2; int ABend = Abegin + Alen; //Split B int BAbegin = Bbegin; int BBbegin = Bbegin + Blen/2; int BAend = Bbegin + Blen/2; int BBend = Bbegin + Blen; //Find correct split for B int sizeLCSOriginal = getLCSLength(A, Abegin, Aend, B, Bbegin, Bend); int k = 0; for (k = 0; k < Blen+1; k++){ BBbegin = Bbegin + k; BAend = Bbegin + k; int sizeLCSA = getLCSLength(A, AAbegin, AAend, B, BAbegin, BAend); int sizeLCSB = getLCSLength(A, ABbegin, ABend, B, BBbegin, BBend); if(sizeLCSA + sizeLCSB == sizeLCSOriginal){ break; //Found the split } } //Let's split! findLCS(A, AAbegin, AAend, B, BAbegin, BAend); findLCS(A, ABbegin, ABend, B, BBbegin, BBend); return; } }
int main (void) { int d = read (); while (d--) { int agnes[2001], m = 0; int temp = 1, a = 0; while (temp) { temp = read (); agnes[a++] = temp; } while (true) { int tom[2001], t = 1; temp = read (); if (temp == 0) break; tom[0] = temp; temp = 1; while (temp) { temp = read (); tom[t++] = temp; } m = max (m, getLCSLength (agnes, a-1, tom, t-1)); } printf ("%d\n", m); } return 0; }