Cod sursa(job #205161)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 29 august 2008 16:21:39
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
# include <stdio.h>
# include <string.h>

using namespace std;

# define FIN "seif.in"
# define FOUT "seif.out"
# define MAXN 1024
# define Alph 32
# define uc unsigned char

int T,N,M,i,j,l,K,ln,lm,k;
int D[MAXN][MAXN];
char s1[MAXN];
char s2[MAXN];
uc A[MAXN][Alph];
uc B[MAXN][Alph];

     inline int max(int A, int B)
     {
        return A>B?A:B;
     }

     int main()
     {
         freopen(FIN,"r",stdin);
         freopen(FOUT,"w",stdout);
         
         scanf("%d",&T);
         for (k = 1; k <= T; ++k)
           {
              scanf("%d\n",&K);
              
              scanf("%s\n",s1+1);
              scanf("%s\n",s2+1);
              
              ln = strlen(s1+1);
              lm = strlen(s2+1);
              
              for (i = ln; i >= 1; --i)
                for (j = lm; j >= 1; --j)
                  if (s1[i] == s2[j])
                    D[i][j]=D[i+1][j+1]+1;
                  else
                    D[i][j]=max(D[i+1][j],D[i][j+1]);
                    
             /*memset(A, 0, sizeof(A));
             memset(B, 0, sizeof(B));*/
             
             for (i = ln; i >= 1; --i)
               for (j = 0; j < 26; ++j)       
                 if (s1[i] == j+'A') A[i][j] = i;
                  else A[i][j] = A[i+1][j];
                  
             for (i = lm; i >= 1; --i)
               for (j = 0; j < 26; ++j)
                 if (s2[i] == j+'A') B[i][j] = i;
                  else B[i][j] = B[i+1][j];
             
             i = 1; j = 1;
             int ok = 0;
             while (!ok && i<=ln && j <= lm)
               {
                  ok = 1;
                  for (l = 25; l>=0&&ok==1; --l)
                     {
                        if (D[A[i][l]][B[j][l]] < K) continue; 
                        printf("%c",l+'A');
                        i = A[i][l]+1;
                        j = B[j][l]+1;
                        ok = 0;
                     }
                  K--;
               }
             
             printf("\n");
           }
         
         return 0;
     }