Cod sursa(job #253389)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 18:56:37
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <stdio.h>  
 #include <string>  
 #include <vector>  
 #include <algorithm>  
   
 using namespace std;  
   
 #define maxn 1010  
 #define maxalf 26  
 #define max(a,b) (a > b ? a : b)  
   
 int n, m, k, l;  
 char a[maxn], b[maxn];  
 int c[maxn][maxn];  
 vector <int> p1[maxalf];  
 vector <int> p2[maxalf];  
 int g1[maxn], g2[maxn];  
 char sol[maxn];  
   
 int main()  
 {  
     freopen("seif.in", "r", stdin);  
     freopen("seif.out", "w", stdout);  
   
     int i, j, T, found;  
   
     for (scanf("%d ", &T) ; T; T--)  
     {  
         scanf("%d ", &k);  
   
         scanf("%s ", a+1);  
         scanf("%s ", b+1);  
   
         n = strlen(a+1);  
         m = strlen(b+1);  
   
         reverse(a+1, a+n+1);  
         reverse(b+1, b+m+1);  
   
         for (i=0; i<maxalf; i++)  
         {  
             p1[i].clear();  
             p2[i].clear();  
         }  
   
         for (i=1; i<=n; i++) p1[a[i]-'A'].push_back(i);  
         for (i=1; i<=m; i++) p2[b[i]-'A'].push_back(i);  
   
         for (i=0; i<maxalf; i++)   
         {  
             g1[i] = p1[i].size() - 1;  
             g2[i] = p2[i].size() - 1;  
         }  
   
         for (i=1; i<=n; i++)  
             for (j=1; j<=m; j++)  
                 if (a[i] == b[j]) c[i][j] = c[i-1][j-1] + 1;  
                 else c[i][j] = max(c[i-1][j], c[i][j-1]);  
   
         found = 1;  
         l = 0;  
         while (found)  
         {  
             found = 0;  
             for (i=maxalf-1; i>=0; i--)  
             {  
                 while (g1[i]>=0 && p1[i][g1[i]]>n) g1[i]--;  
                 while (g2[i]>=0 && p2[i][g2[i]]>m) g2[i]--;  
   
                 if (g1[i]>=0 && g2[i]>=0 && c[p1[i][g1[i]]][p2[i][g2[i]]]>=k)  
                 {  
                     n = p1[i][g1[i]] - 1;  
                     m = p2[i][g2[i]] - 1;  
                     sol[++l] = 'A' + i;  
                     found = 1;  
                     break;  
                 }  
             }  
   
             k--;  
         }  
   
         for (i=1; i<=l; i++) printf("%c", sol[i]);  
         printf("\n");  
     }  
   
     return 0;  
}