Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int INF = (int)1e9;
- vector<vector<int>> dp;
- string ans1 = "", ans2 = "";
- int diff(char a, char b)
- {
- if(a != b)
- return 1;
- else
- return 0;
- }
- int cnt, k = 0, k1 = 0;
- string s1, s2;
- void f(int i, int j)
- {
- if(i > 0 && dp[i][j] == dp[i - 1][j] + 1)
- {
- ans1.push_back(s1[i - 1]);
- ans2.push_back('-');
- k1++;
- f(i - 1, j);
- }
- else if(i > 0 && j > 0 && (dp[i][j] == dp[i - 1][j - 1] + 1 || dp[i][j] == dp[i - 1][j - 1]))
- {
- ans1.push_back(s1[i - 1]);
- ans2.push_back(s2[j - 1]);
- f(i - 1, j - 1);
- }
- else if(j > 0 && dp[i][j] == dp[i][j - 1] + 1)
- {
- ans1.push_back('-');
- ans2.push_back(s2[j - 1]);
- f(i, j - 1);
- }
- }
- int DP(int i, int j)
- {
- if(dp[i][j] == INF)
- {
- if(j == 0)
- return dp[i][j] = i;
- else if(i == 0)
- return dp[i][j] = j;
- else
- {
- int ins = DP(i, j - 1) + 1;
- int del = DP(i - 1, j) + 1;
- int sub = DP(i - 1, j - 1) + diff(s1[i - 1], s2[j - 1]);
- return dp[i][j] = min({ins, del, sub});
- }
- }
- else
- return dp[i][j];
- }
- main()
- {
- cin >> s1 >> s2;
- int n = s1.size(), m = s2.size();
- dp.resize(n + 2, vector<int>(m + 2, INF));
- cnt = DP(n, m);
- f(n, m);
- int k2 = 0, k3 = 0;
- reverse(ans1.begin(), ans1.end());
- reverse(ans2.begin(), ans2.end());
- cout << cnt << "\n";
- cout << ans1 << "\n" << ans2 << "\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement