Advertisement
dark-Matter

ntttask

Jan 7th, 2021
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. int main() {
  7.     string s1, s2;
  8.     cout << "s1: ";
  9.     cin >> s1;
  10.     cout << "s2: ";
  11.     cin >> s2;
  12.     int n = s1.length(), m = s2.length();
  13.     int dp[n+1][m+1] = {0};
  14.    
  15.     // penalties
  16.     int gap = 2; // penalty for matching a chartacter to a gap
  17.     int mis = 3; // penalty for matching a character to a different character
  18.  
  19.  
  20.     for (int i = 1; i < n+1; i++)
  21.         dp[i][0] = i*gap;
  22.    
  23.     for (int i = 1; i < m+1; i++)
  24.         dp[0][i] = i*gap;
  25.  
  26.     for (int i = 1; i < n+1; i++)
  27.         for (int j = 1; j < m+1; j++)
  28.         {
  29.             if ( s1[i-1] == s2[j-1]) dp[i][j] = dp[i-1][j-1];
  30.             else dp[i][j] = min({dp[i][j-1] + gap, dp[i-1][j] + gap, dp[i-1][j-1] + mis});
  31.         }
  32.    
  33.     string s1_out="", s2_out="";
  34.  
  35.     int i=n, j=m;
  36.  
  37.     cout << "Gap Score: " << dp[n][m] << endl;
  38.  
  39.     while (i>0 && j > 0) {
  40.         if (s1[i-1] == s2[j-1] || dp[i-1][j-1] + mis == dp[i][j]) {
  41.             s1_out += s1[i-1];
  42.             s2_out += s2[j-1];
  43.             i--; j--;
  44.         }
  45.         else if (dp[i][j-1] + gap == dp[i][j]) {
  46.             s1_out += '-';
  47.             s2_out += s2[j-1];
  48.             j--;
  49.         }
  50.         else if (dp[i-1][j] + gap == dp[i][j]) {
  51.             s1_out += s1[i-1];
  52.             s2_out += '-';
  53.             i--;
  54.         }
  55.     }
  56.    
  57.     while (i--){
  58.         s1_out += s1[i];
  59.     }
  60.  
  61.     while (j--) {
  62.         s2_out += s2[j];
  63.     }
  64.  
  65.     while (s1_out.length() > s2_out.length()) {
  66.         s2_out += '-';
  67.     }
  68.  
  69.     while (s2_out.length() > s1_out.length()) {
  70.         s1_out += '-';
  71.     }
  72.  
  73.     reverse(s1_out.begin(), s1_out.end());
  74.     reverse(s2_out.begin(), s2_out.end());
  75.     cout << s1_out << '\n' << s2_out << endl;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement