/
Shortest length common supersequence.cpp
136 lines (104 loc) Β· 2.88 KB
/
Shortest length common supersequence.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
///////////////////////////////////////////
//Question/Info
Shortest Common Supersequence Length
Given two strings str1 and str2,
the task is to find the length of the
shortest string that has both str1 and str2 as subsequences.
Examples :
Input: str1 = "geek", str2 = "eke"
Output: 5
Explanation:
String "geeke" has both string "geek"
and "eke" as subsequences.
Input: str1 = "AGGTAB", str2 = "GXTXAYB"
Output: 9
Explanation:
String "AGXGTXAYB" has both string
"AGGTAB" and "GXTXAYB" as subsequences.
///////////////////////////////////////////
*/
#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define setbits(x) __builtin_popcount(x)
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define eb(x) emplace_back(x)
#define ct(x) cout<<x<<endl;
#define ct2(x,y) cout<<x<<" "<<y<<endl;
#define forn(i,n) for(int i = 0; i < (int)(n); i++)
#define forx(i,x,n) for(int i = x; i < (int)(n); i++)
#define all(v) v.begin(),v.end()
#define fsp(x,y) fixed<<setprecision(y)<<x;
#define PI 3.1415926535897932384626433832795
#define MOD 1000000007 // (1e9+7)
#define pii pair<int,int>
#define pis pair<int,string>
#define vi vector<int>
#define vii vector<pii>
#define mii map<int,int>
// typedef long long int lli;
typedef long double ld;
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
void c_p_c()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
}
// using bottom up dp
int scs(string a, string b, int la, int lb) {
int dp[la + 1][lb + 1];
forn(i, la + 1) {
forn(j, lb + 1) {
// base case
if (i == 0 or j == 0) {
dp[i][j] = 0;
}
else {
if (a[i - 1] == b[j - 1]) {
dp[i][j] = 1 + dp[i - 1][j - 1];
}
else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
}
/*
So now we can get the dp length...
So now considering the strings: "geek" & "eke".
So the common strings would be: ek, and this subsequence is
repeated in both. Hence if we have to find a supersequence:
The easiest supersequence we can have is : "geekeke"
As it has both strings. But this is a long supersequence.
We have to find an optimised supersequence. Since we have "ek",
repeating twice in both, we can remove one of the "ek" and hence
our supersequence would be optimised, i.e: "geeke".
Since our focus is only on length, hence the length of the
optimised supersequence would be : la+lb-(dp[la][lb])
*/
int kk = la + lb - dp[la][lb];
return kk;
}
int32_t main() {
///////////
c_p_c();
///////////
// code
/*
int t ; cin >> t; while(t--){}
*/
string a = "geek";
string b = "eke";
int la = a.length();
int lb = b.length();
// dp bottom up
ct(scs(a , b , la, lb));
// cerr << "time: " << clock() << " ms" << '\n';
return 0;
}