Advertisement
Georgiy1108

Untitled

Sep 23rd, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.36 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int INF = (int)1e9;
  6.  
  7. vector<vector<int>> dp;
  8.  
  9. string ans1 = "", ans2 = "";
  10.  
  11. int diff(char a, char b)
  12. {
  13.     if(a != b)
  14.         return 1;
  15.     else
  16.         return 0;
  17. }
  18.  
  19. int cnt, k = 0, k1 = 0;
  20. string s1, s2;
  21.  
  22. void f(int i, int j)
  23. {
  24.     if(i > 0 && dp[i][j] == dp[i - 1][j] + 1)
  25.     {
  26.         ans1.push_back(s1[i - 1]);
  27.         ans2.push_back('-');
  28.         k1++;
  29.         f(i - 1, j);
  30.     }
  31.     else if(i > 0 && j > 0 && (dp[i][j] == dp[i - 1][j - 1] + 1 || dp[i][j] == dp[i - 1][j - 1]))
  32.     {
  33.         ans1.push_back(s1[i - 1]);
  34.         ans2.push_back(s2[j - 1]);
  35.         f(i - 1, j - 1);
  36.     }
  37.     else if(j > 0 && dp[i][j] == dp[i][j - 1] + 1)
  38.     {
  39.         ans1.push_back('-');
  40.         ans2.push_back(s2[j - 1]);
  41.         f(i, j - 1);
  42.     }
  43.        
  44. }
  45.  
  46. int DP(int i, int j)
  47. {
  48.     if(dp[i][j] == INF)
  49.     {
  50.         if(j == 0)
  51.             return dp[i][j] = i;
  52.         else if(i == 0)
  53.             return dp[i][j] = j;
  54.         else
  55.         {
  56.             int ins = DP(i, j - 1) + 1;
  57.             int del = DP(i - 1, j) + 1;
  58.             int sub = DP(i - 1, j - 1) + diff(s1[i - 1], s2[j - 1]);
  59.             return dp[i][j] = min({ins, del, sub});
  60.         }
  61.     }
  62.     else
  63.         return dp[i][j];
  64. }
  65.  
  66. main()
  67. {
  68.     cin >> s1 >> s2;
  69.     int n = s1.size(), m = s2.size();
  70.     dp.resize(n + 2, vector<int>(m + 2, INF));
  71.     cnt = DP(n, m);
  72.     f(n, m);
  73.     int k2 = 0, k3 = 0;
  74.     reverse(ans1.begin(), ans1.end());
  75.     reverse(ans2.begin(), ans2.end());
  76.     cout << cnt << "\n";
  77.     cout << ans1 << "\n" << ans2 << "\n";
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement