Advertisement
Guest User

Untitled

a guest
Aug 30th, 2014
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. /*
  2.         By: facug91
  3.         From:
  4.         Name:
  5.         Number:
  6.         Date: 30/08/2014
  7. */
  8.  
  9. #include <bits/stdc++.h>
  10. #define MAX_INT 2147483647
  11. #define MAX_LONG 9223372036854775807ll
  12. #define MAX_ULONG 18446744073709551615ull
  13. #define MAX_DBL 1.7976931348623158e+308
  14. #define EPS 1e-9
  15. const double PI = 2.0*acos(0.0);
  16.  
  17. #define INF 1000000000
  18. //#define MOD 1000000007
  19. //#define MAXN 6005
  20.  
  21. using namespace std;
  22. typedef long long ll;
  23. typedef pair<int, int> ii;
  24.  
  25. int sizes, sizet, sizett, LD[4010][2010], limit;
  26. char s[2010], t[4010], action[4010][2010];
  27.  
  28. void ld () {
  29.     int i, j, size1 = sizes, size2 = sizet*2, cha, ins, del;
  30.     for (j=0; j<=size1; j++)
  31.         LD[0][j] = j;
  32.     for (i=0; i<=size2; i++)
  33.         LD[i][0] = i;
  34.     for (i=1; i<=size2; i++) {
  35.         for (j=1; j<=size1; j++) {
  36.             cha = LD[i-1][j-1] + (s[j-1] != t[i-1]);
  37.             ins = LD[i-1][j] + 1;
  38.             del = LD[i][j-1] + 1;
  39.             if (cha <= ins && cha <= del) {
  40.                 LD[i][j] = cha;
  41.                 if (s[j-1] == t[i-1]) action[i][j] = 'N';
  42.                 else action[i][j] = 'C';
  43.             } else if (del <= ins && del <= cha) {
  44.                 LD[i][j] = del;
  45.                 action[i][j] = 'D';
  46.             } else {
  47.                 LD[i][j] = ins;
  48.                 action[i][j] = 'I';
  49.             }
  50.         }
  51.     }
  52. }
  53.  
  54. int count (int i, int j) {
  55.     if (i == limit && j == 0) return 0;
  56.     if (j == 0) return i-limit;
  57.     if (i == limit) return j;
  58.    
  59.     if (action[i][j] == 'N') return count(i-1, j-1);
  60.     if (action[i][j] == 'C') return count(i-1, j-1) + 1;
  61.     if (action[i][j] == 'D') return count(i, j-1) + 1;
  62.     if (action[i][j] == 'I') return count(i-1, j) + 1;
  63. }
  64.  
  65. int main () {
  66.     int i, j;
  67.    
  68.     gets(s);
  69.     gets(t);
  70.    
  71.     sizes = strlen(s);
  72.     sizet = strlen(t);
  73.    
  74.     for (i=0; i<sizet; i++)
  75.         t[sizet+i] = t[i];
  76.     sizett = sizet*2;
  77.     t[sizett] = 0;
  78.    
  79.     ld();
  80.    
  81.     for (i=sizet; i<sizett; i++) {
  82.         limit = i-sizet;
  83.         printf("%d\n", count(i, sizes));
  84.     }
  85.    
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement