Cod sursa(job #140726)

Utilizator mariussMarius Telespan mariuss Data 22 februarie 2008 10:29:52
Problema Seif Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<stdio.h>
#include<string.h>
#define nmax 1010
int t,q,i,j,aux,pp1,pp2,k,v[nmax][nmax],l1,l2;
int pa[26][nmax], pb[26][nmax];
char a[nmax],b[nmax];
inline int max(int p,int q)
{
    if(p>q)
        return p;
    else
        return q;

}

int main()
{
	freopen("seif.in","r",stdin);
    freopen("seif.out","w",stdout);
    
    scanf("%d",&t);
    
    for(;t>0;t--)
    {
        scanf("%d\n",&k);
        
        scanf("%s\n",&a);
        scanf("%s\n",&b);
    
        l1=strlen(a);
        l2=strlen(b);
        
        memset(pa, 0, sizeof(pa));
        memset(pb, 0, sizeof(pb));
        
        for (i = 'A'; i <= 'Z'; i++) {
			pa[i - 'A'][l1] = l1;
			for (j = l1 - 1; j >= 0; j--)
				if (a[j] == i) pa[i - 'A'][j] = j;
				else pa[i - 'A'][j] = pa[i - 'A'][j + 1];
		}
		
	    for (i = 'A'; i <= 'Z'; i++) {
			pb[i - 'A'][l2] = l1;
			for (j = l2 - 1; j >= 0; j--)
				if (b[j] == i) pb[i - 'A'][j] = j;
				else pb[i - 'A'][j] = pb[i - 'A'][j + 1];
		}
    
        memset(v,0,sizeof(v));

		for(i=l1-1;i>=0;i--)
            for(j=l2-1;j>=0;j--)
            {
                if(a[i]==b[j])
                    v[i][j]=v[i+1][j+1]+1;
                else
                    v[i][j]=max(v[i+1][j],v[i][j+1]);
			}

    
        pp1=0;
		pp2=0;

		i='Z';

		aux=1;
		while(1)
		{
			for (i = 'Z'; i >= 'A'; i--) {
				j = pa[i - 'A'][pp1];
				q = pb[i - 'A'][pp2];
	
				if(j==l1 || q==l2 || v[j][q] < k) continue;
				
				if(v[j][q]>=k)
				{
					printf("%c",i);
					k--;
					pp1=j+1;
					pp2=q+1;
					break;
				}
			}
			
			if (i == 'A' - 1) break;
		}
		

        printf("\n");                
    }
    return 0;
}