Cod sursa(job #205159)

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

using namespace std;

# define FIN "seif.in"
# define FOUT "seif.out"
# define MAXN 1005
# define Alph 27
# define uc unsigned char

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

     int max(int i, int j)
     {
         if (D[i+1][j]<D[i][j+1])
           return D[i][j+1];
         return D[i+1][j];
     }

     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(i,j);
                    
             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];
             
             int X,Y;     
             for (i = 25; i >= 0; --i)
               if (D[A[1][i]][B[1][i]]>=K)
                 {
                    X = A[1][i];
                    Y = B[1][i];
                    K = D[X][Y++]-1;
                    printf("%c",s1[X++]);
                    break;
                 }
                 
             while (K != 0)
               {
                  for (i = 25; i >= 0; --i)
                    if (D[A[X][i]][B[Y][i]]==K)
                      {
                         X = A[X][i];
                         Y = B[Y][i]+1;
                         K--;
                         printf("%c",s1[X++]);
                         break;
                      }
               }
             printf("\n");
           }
         
         return 0;
     }