Advertisement
cmiN

tlcs3

Apr 25th, 2011
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <ctime>
  7.  
  8. using namespace std;
  9.  
  10. const char iname[] = "c:\\in.txt";
  11. const char oname[] = "c:\\out.txt";
  12.  
  13. #define MAXN  1005
  14.  
  15. #define PB push_back
  16. #define MP make_pair
  17. #define FOR(i, a, b) for (int i = (a); i <= (b); ++ i)
  18. #define MAX(a, b)    ((a) > (b) ? (a) : (b))
  19.  
  20. char A[MAXN], B[MAXN], RA[MAXN], RB[MAXN];
  21.  
  22. int L1[MAXN], L2[MAXN], K[2][MAXN];
  23.  
  24.  
  25. void lcs(int m, int n, char *A, char *B, int L[])
  26. {
  27.     FOR (j, 0, n)  K[1][j] = 0;
  28.     FOR (i, 1, m) {
  29.         FOR (j, 0, n)  K[0][j] = K[1][j];
  30.         FOR (j, 1, n) {
  31.             if (A[i] == B[j])
  32.                 K[1][j] = K[0][j - 1] + 1;
  33.             else
  34.                 K[1][j] = MAX(K[0][j], K[1][j - 1]);
  35.         }
  36.     }
  37.     FOR (j, 0, n)  L[j] = K[1][j];
  38. }
  39.  
  40. void work(int m, int n, char *A, char *B, char *RA, char *RB, vector <int> &C)
  41. {
  42.     if (n == 0) /* add the empty string to C */
  43.         return ;
  44.     if (m == 1) {
  45.         FOR (j, 1, n) if (A[1] == B[j]) {
  46.             C.PB(A+1 - ::A);
  47.             break ;
  48.         }
  49.         return ;
  50.     }
  51.  
  52.     int i = (m+1) / 2;
  53.     lcs(i, n, A, B, L1);
  54.     lcs(m - i, n, RA, RB, L2);
  55.      
  56.     int M = 0;
  57.     FOR (j, 0, n)
  58.         M = MAX(M, L1[j] + L2[n - j]);
  59.     int k;
  60.     FOR (j, 0, n) if (M == L1[j] + L2[n - j]) {
  61.         k = j;
  62.         break ;
  63.     }
  64.  
  65.     work(i, k, A, B, RA + m-i, RB + n-k, C);
  66.     work(m - i, n - k, A + i, B + k, RA, RB, C);
  67. }
  68.  
  69. int main(void)
  70. {
  71.     clock_t tstart = clock();
  72.  
  73.     int css;
  74.     int m, n;
  75.     vector <int> R;
  76.      
  77.     scanf("%d", &css);
  78.     FOR (stp, 1, css)
  79.     {
  80.         scanf("%d %s\n", &m, A+1);
  81.         FOR (i, 1, m)
  82.             RA[i] = A[m-i+1];
  83.         scanf("%d %s\n", &n, B+1);
  84.         FOR (i, 1, n)
  85.             RB[i] = B[n-i+1];
  86.          
  87.         if (((double)(clock() - tstart)) / CLOCKS_PER_SEC < 4.95)
  88.         {
  89.             vector <int>().swap(R);
  90.             work(m, n, A, B, RA, RB, R);
  91.      
  92.             if (R.size()) {
  93.                 printf("case %d Y\n", stp);
  94.                 printf("%d\n", R.size());
  95.                 int j = 0;
  96.                 FOR (i, 0, (int)R.size() - 1) {
  97.                     while (B[++ j] != A[R[i]]) ;
  98.                     printf("%c %d %d\n", B[j], R[i], j);
  99.                 }
  100.             } else
  101.                 printf("case %d N\n", stp);
  102.         } else
  103.             printf("case %d N\n", stp);
  104.     }
  105.          
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement