コード例 #1
0
ファイル: findLCS.c プロジェクト: bradlys/360-noscope-mlg-lcs
/**
 * 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;
    }
}
コード例 #2
0
ファイル: crscntry.cpp プロジェクト: asm123/Codechef
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;
}