Advertisement
cmiN

tlcs

Apr 23rd, 2011
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.83 KB | None | 0 0
  1. #include <cstdio>
  2. #include <ctime>
  3.  
  4. const int N = 1024;
  5. int start = 1, lenx, leny, mat[N][N], lenf, lenl;
  6. char vecx[N], vecy[N];
  7. struct {
  8.     char c;
  9.     int x, y;
  10. } word[N], first[N], last[N];
  11.  
  12. inline int maxim(int a, int b)
  13. {
  14.     return ((a > b) ? (a) : (b));
  15. }
  16.  
  17. void writestr(int a, int b)
  18. {
  19.     if (mat[a][b]) {
  20.         if (vecx[a] == vecy[b]) {
  21.             word[mat[a][b]].c = vecx[a];
  22.             word[mat[a][b]].x = a;
  23.             word[mat[a][b]].y = b;
  24.             writestr(a - 1, b - 1);
  25.         } else {
  26.             if (mat[a][b] == mat[a][b - 1]) {
  27.                 writestr(a, b - 1);
  28.             } else {
  29.                 writestr(a - 1, b);
  30.             }
  31.         }
  32.     }
  33. }
  34.  
  35. inline void optimize()
  36. {
  37.     int i;
  38.     start = 1;
  39.     lenf = lenl = 0;
  40.     while (vecx[start] == vecy[start]) {
  41.         first[++lenf].c = vecx[start];
  42.         first[lenf].x = first[lenf].y = start;
  43.         ++start;
  44.     }
  45.     while (vecx[lenx] == vecy[leny]) {
  46.         last[++lenl].c = vecx[lenx];
  47.         last[lenl].x = lenx;
  48.         last[lenl].y = leny;
  49.         --lenx;
  50.         --leny;
  51.     }
  52.     for (i = start - 1; i <= lenx && i <= leny; ++i) { // si acum .... ->
  53.         mat[start - 1][i] = mat[i][start - 1] = 0;
  54.     } // initializarea pulii
  55.     while (i <= lenx) {
  56.         mat[i][start - 1] = 0;
  57.         ++i;
  58.     } // inainte nu era nevoie ca mereu aveam start = 1 :D
  59.     while (i <= leny) {
  60.         mat[start - 1][i] = 0;
  61.         ++i;
  62.     }
  63. }
  64.  
  65. inline void process()
  66. {
  67.     int i, j;
  68.     optimize();
  69.     for (i = start; i <= lenx && i <= leny; ++i) {
  70.         if (vecx[i] == vecy[i]) {
  71.             mat[i][i] = mat[i - 1][i - 1] + 1;
  72.         } else {
  73.             mat[i][i] = maxim(mat[i][i - 1], mat[i - 1][i]);
  74.         }
  75.         for (j = i + 1; j <= lenx && j <= leny; ++j) {
  76.             if (vecx[i] == vecy[j]) {
  77.                 mat[i][j] = mat[i - 1][j - 1] + 1;
  78.             } else {
  79.                 mat[i][j] = maxim(mat[i][j - 1], mat[i - 1][j]);
  80.             } // aici e magia
  81.             if (vecx[j] == vecy[i]) {
  82.                 mat[j][i] = mat[j - 1][i - 1] + 1;
  83.             } else {
  84.                 mat[j][i] = maxim(mat[j][i - 1], mat[j - 1][i]);
  85.             }
  86.         }
  87.         while (j <= lenx) {
  88.             if (vecx[j] == vecy[i]) {
  89.                 mat[j][i] = mat[j - 1][i - 1] + 1;
  90.             } else {
  91.                 mat[j][i] = maxim(mat[j][i - 1], mat[j - 1][i]);
  92.             }
  93.             ++j;
  94.         }
  95.         while (j <= leny) {
  96.             if (vecx[i] == vecy[j]) {
  97.                 mat[i][j] = mat[i - 1][j - 1] + 1;
  98.             } else {
  99.                 mat[i][j] = maxim(mat[i][j - 1], mat[i - 1][j]);
  100.             }
  101.             ++j;
  102.         }
  103.     }
  104.     writestr(lenx, leny);
  105. }
  106.  
  107. int main()
  108. {
  109.     //freopen("tlcs.in", "rt", stdin);
  110.     clock_t timp = clock();
  111.     int nr, i, j, sum;
  112.     scanf("%d\n", &nr);
  113.     for (i = 1; i <= nr; ++i) {
  114.         if ((((double) (clock() - timp)) / CLOCKS_PER_SEC) < 4.9) {
  115.             scanf("%d %s\n", &lenx, vecx + 1);
  116.             scanf("%d %s\n", &leny, vecy + 1);
  117.             process();
  118.             sum = mat[lenx][leny] + lenf + lenl;
  119.             if (sum > 0) {
  120.                 printf("case %d Y\n", i);
  121.                 printf("%d\n", sum);
  122.                 for (j = 1; j <= lenf; ++j) {
  123.                     printf("%c %d %d\n", first[j].c, first[j].x, first[j].y);
  124.                 }
  125.                 for (j = 1; j <= mat[lenx][leny]; ++j) {
  126.                     printf("%c %d %d\n", word[j].c, word[j].x, word[j].y);
  127.                 }
  128.                 for (j = lenl; j >= 1; --j) {
  129.                     printf("%c %d %d\n", last[j].c, last[j].x, last[j].y);
  130.                 }
  131.             } else {
  132.                 printf("case %d N\n", i);
  133.             }
  134.         } else {
  135.             printf("case %d N\n", i);
  136.         }
  137.     }
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement