# Condensed DSA course with C++ - Code transcripts
###### tags: `C++` `DSA`
Author: [thucngch](http://fb.com/thucngch)
# Session 1 - 2020 Sep 17, 20:30
- Primality check
- Prime generation techniques
## Code
```cpp=
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
typedef vector<int> vi_t;
bool is_prime(int n) {
if (n < 2) return false;
for (int d = 2; d <= sqrt(n); d++) {
if (n % d == 0) return false;
}
return true;
}
vi_t primes(int n) {
vi_t p;
for (int i=2; i <= n; i++) {
if (is_prime(i)) p.push_back(i);
}
return p;
}
vi_t primes_sieve(int n) {
vi_t p;
int check[n+1];
for (int i=0; i<n+1; i++) check[i] = 1;
check[0] = check[1] = 0;
for (int d = 2; d <= sqrt(n); d++) {
if (check[d]) {
for (int k = d*d; k < n+1; k += d) {
check[k] = 0;
}
}
}
for (int i=2; i <= n; i++) {
if (check[i]) p.push_back(i);
}
return p;
}
int main() {
int m;
cin >> m;
// cout << "Is Prime: " << is_prime(m);
cout << "All prime not greater than " << m << ":" << endl;
vi_t p = primes_sieve(m);
// for (int i=0; i < p.size(); i++) {
// cout << p[i] << " ";
// }
cout << endl << "Total: " << p.size() << " primes!";
}
```
## Problems
See in Google Drive docs.
# Session 2 - 2020 Sep 20, 10:00
- File I/O
- GCD / LCM
- Modulos
- Logarithmic Exponentiation
- Integer Factorization
- Number of combinations
- Fibonacci, fast n-th fibonacci calculation
## File input / output
```cpp=
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream fi;
fi.open("fileio.inp");
ofstream fo;
fo.open("fileio.out");
int a, b;
fi >> a >> b;
string s;
fi.ignore(); // skip to next line
getline(fi, s);
fo << a + b << endl;
fo << "Hello " << s << endl;
fi.close();
fo.close();
}
```
## Math
```cpp=
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MOD = 1000000007;
//(a + b) % p === a%p + b%p
//(a - b) % p === a%p - b%p
//(a * b) % p === a%p * b%p
//(a / b) % p === a%p / b%p --> NOT TRUE
int pow1(int a, int n) {
int p = 1;
for (int i = 0; i < n; i ++) {
p = (p*a) % MOD;
}
return p;
}
int pow2(int a, int n) {
if (n==0) return 1;
long long b = pow2(a, n/2);
long long p = (b*b) % MOD;
if (n%2) p = (p*a) % MOD;
return int(p);
}
int fibo1(int n) {
int f1 = 0, f2 = 1;
for (int i = 0; i < n; i++) {
int tmp = f1;
f1 = f2;
f2 = (tmp + f2) % MOD;
}
return f1;
}
int fibo2(int n) {
// fibo2(n) <-- fibo2(n/2)
}
vector<int> factorization(int n) {
// TODO: 12 = 2 2 3 --> 2^2 x 3
vector<int> v;
int p = 2;
while (n >= p*p) {
while (n % p == 0) {
v.push_back(p);
n /= p;
}
p += 1;
}
if (n>1) v.push_back(n);
return v;
}
int gcd(int m, int n) {
return __gcd(m, n);
}
int lcm(int m, int n) {
return m * n / gcd(m, n);
}
int combination(int n, int k) {
// F1. C(n, k) = n * (n-1) * (n-2) * ... (n-k+1) / k!
// F2. C(n, k) = n! / (k! * (n-k)!)
// F3. C(n,k) = C(n-1, k) + C(n-1, k-1) --> Pascal's triangle
// 1
// 1 1
// 1 2 1
// 1 3 3 1
// 1 4 6 4 1
// 1 5 10 10 5 1
}
int main() {
// int a, n;
// cin >> a >> n;
// cout << pow2(a, n);
// int n;
// cin >> n;
// vector<int> f = factorization(n);
// for (int i = 0; i < f.size(); i++) {
// cout << f[i] << " ";
// }
int a, b;
cin >> a >> b;
cout << gcd(a, b) << " " << lcm(a, b);
}
```
# Session 3 - 2020 Sep 24, 19:30
- Array
- Vector
- Sliding windows
```cpp
// nhap vao 1 mang so nguyen
// 1. Tim so lon nhat
// 2. So luong so lon nhat
// 3. Chi so cua so lon nhat dau tien va cuoi cung
#include <iostream>
#include <fstream>
using namespace std;
int main() {
int n;
ifstream cin("array.INP");
cin >> n;
int a[n];
for (int i=0; i<n; i++) cin >> a[i];
int vmax = a[0], imax1 = 0, imax2 = 0, cmax = 1;
for (int i=0; i<n; i++) {
if (a[i] > vmax) {
vmax = a[i];
cmax = 1;
imax1 = i;
} else if (a[i] == vmax) {
cmax += 1;
imax2 = i;
}
}
cout << vmax << " " << cmax << " " << imax1 << " " << imax2;
cin.close();
}
```
```cpp
// nhap vao mot mang a gom n so nguyen, va so k <= n
// tim gia tri lon nhat cua tong k so lien tiep trong mang a.
#include <iostream>
#include <fstream>
using namespace std;
int main() {
int n, k;
ifstream cin("sliding_windows.INP");
cin >> n >> k;
int a[n];
for (int i=0; i<n; i++) cin >> a[i];
int sum_k = 0, max_sum;
for (int i=0; i<k; i++) sum_k += a[i];
max_sum = sum_k;
for (int i=1; i<=n-k; i++) {
sum_k = sum_k - a[i-1] + a[i+k-1];
if (sum_k > max_sum) max_sum = sum_k;
}
cout << max_sum;
cin.close();
}
```
```cpp
// nhap vao 1 ma tran, in ra ma tran chuyen vi (doi dong thanh cot)
#include <iostream>
#include <fstream>
using namespace std;
int main() {
int n, m;
ifstream cin("matrix.INP");
cin >> n >> m;
int a[n][m];
int b[m][n];
for (int i=0; i<n; i++) {
for (int j=0; j<m; j++) {
cin >> a[i][j];
b[j][i] = a[i][j];
}
}
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
cout << b[i][j] << " ";
}
cout << endl;
}
cin.close();
}
```
```cpp
// nhap vao 1 so n, in ra ma tran nxn so theo chieu xoan oc, vi du:
// 1 2 3 4
// 12 13 14 5
// 11 16 15 6
// 10 9 8 7
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n;
cin >> n;
int a[n][n];
int i = 0, j = 0;
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
a[i][j] = 0;
}
}
int di[4] = {0, 1, 0, -1};
int dj[4] = {1, 0, -1, 0};
int dir = 0;
for (int d=1; d<=n*n; d++) {
a[i][j] = d;
int i_new = i + di[dir];
int j_new = j + dj[dir];
if (i_new<0 || i_new>=n || j_new<0 || j_new>=n || a[i_new][j_new]>0) {
dir = (dir + 1) % 4;
i_new = i + di[dir];
j_new = j + dj[dir];
}
i = i_new;
j = j_new;
}
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
cout << setfill('0') << setw(2) << a[i][j] << " ";
}
cout << endl;
}
}
```
# Session 4 - 2020 Sep 27, 10:00
- Balanced parentheses
- Large integer computation
- Word processing
```cpp
// Kiem tra day ngoac tron hop le
#include "iostream"
using namespace std;
int main() {
string s;
cin >> s;
int balance = 0;
for (char c: s) {
if (c=='(') balance += 1;
else balance -= 1;
if (balance < 0) { cout << "NOK"; return 0;}
}
if (balance == 0) cout << "OK";
else cout << "NOK";
}
```
```cpp
// kiem tra day ngoac nhieu loai co hop le khong
// using string as a stack
#include "iostream"
using namespace std;
int main() {
string brackets;
cin >> brackets;
string s = ""; // stack
for (char c: brackets) {
if (c=='(' || c=='[' || c=='{' ) s += c;
else {
int n = s.size();
if (n == 0) { cout << "NOK"; return 0;}
char ch = s[n-1];
if ((c==')' && ch != '(') || (c==']' && ch != '[')
|| (c=='}' && ch != '{')) {
cout << "NOK"; return 0;
} else {
s = s.substr(0, n-1);
}
}
}
if (s.size() == 0) cout << "OK";
else cout << "NOK";
}
```
```cpp
// kiem tra day ngoac nhieu loai co hop le khong
// using STL stack
#include "iostream"
#include "stack"
using namespace std;
int main() {
string brackets;
cin >> brackets;
stack<char> s;
for (char c: brackets) {
if (c=='(' || c=='[' || c=='{' ) s.push(c);
else {
if (s.empty()) { cout << "NOK"; return 0;}
char ch = s.top();
if ((c==')' && ch != '(') || (c==']' && ch != '[')
|| (c=='}' && ch != '{')) {
cout << "NOK"; return 0;
}
s.pop();
}
}
if (s.empty()) cout << "OK";
else cout << "NOK";
}
```
```cpp
// cong 2 so lon
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
string s1, s2, s = "";
cin >> s1 >> s2;
if (s1.size() > s2.size()) swap(s1, s2);
reverse(s1.begin(), s1.end());
reverse(s2.begin(), s2.end());
int n = s2.size() - s1.size();
for (int i=0; i<n; i++) s1 += '0';
int carry = 0;
for (int i=0; i<s1.size(); i++) {
int sum= s1[i]-'0' + s2[i]-'0' + carry;
s += sum%10 + '0';
carry = sum / 10;
}
if (carry>0) s += carry + '0';
reverse(s.begin(), s.end());
cout << s;
}
```
```cpp
// word processing
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int word_count(string s){
s = " " + s;
int count = 0;
for (int i=0; i<s.size()-1; i++) {
if (s[i] == ' ' && s[i+1]!=' ') count += 1;
}
return count;
}
vector<string> word_split(string s){
vector<string> res;
istringstream ss(s);
do {
string word;
ss >> word;
if (word.size() > 0) res.push_back(word);
} while (ss);
return res;
}
int main() {
string s;
getline(cin, s);
cout << word_count(s) << endl;
vector<string> words = word_split(s);
for (int i=0; i<words.size(); i++)
cout << "`" << words[i] << "`" << endl;
}
```
# Session 5 - 2020 Oct 04, 10:00
```cpp
#include <iostream>
using namespace std;
// max(a[1..n])
// = (max(a[1..n-1]), a[n])
// max(a[1..1]) = a[1]
int max1(int a[], int n) { // recursive
if (n==1) return a[0];
int vmax = max1(a, n-1);
if (vmax > a[n-1]) return vmax;
return a[n-1];
}
// max1([5 9 7 2 1 8])
// max1([5 9 7 2 1]) vs 8
// (max1([5 9 7 2]) vs 1) vs 8
// ...
// (max1([5]) vs 9) vs ... vs 8
// 5 vs 9 vs ... vs 8
int max2(int a[], int n) { // dp
int vmax = a[0];
for (int i=1; i < n; i++)
if (a[i] > vmax) vmax=a[i];
return vmax;
}
int main() {
int n;
cin >> n;
int a[n];
for (int i = 0; i < n; i++)
cin >> a[i];
cout << max1(a, n) << endl;
cout << max2(a, n) << endl;
return 0;
}
```
```cpp
#include <iostream>
using namespace std;
// fibo(n) = fibo(n-1) + fibo[n-2]
// fibo(0) = fibo(1) = 1
int fibo1(int n) { // recursive: top-down
if (n<2) return 1;
return fibo1(n-1) + fibo1(n-2);
}
int fibo2(int n) { // dp: bottom-top
int a[n+1];
a[0] = a[1] = 1;
for (int i=2; i <= n; i++)
a[i] = a[i-1] + a[i-2];
return a[n];
}
int main() {
int n;
cin >> n;
cout << fibo1(n) << endl;
cout << fibo2(n) << endl;
return 0;
}
```
```cpp
#include <iostream>
#include <vector>
using namespace std;
// Longest Increasing Subsequence
int main() {
int n;
cin >> n;
int a[n];
for (int i = 0; i < n; i++)
cin >> a[i];
int lis[n];
lis[0] = 1;
int p[n]; // tracing array, store index of previous item in current LIS
p[0] = -1;
for (int i = 1; i < n; i++) {
int Lmax = 1, imax = -1;
for (int j = 0; j<i; j++) {
if (a[j] < a[i] && lis[j]+1>Lmax) {
Lmax = lis[j] + 1;
imax = j;
}
}
lis[i] = Lmax;
p[i] = imax;
}
int vmax = lis[0], imax = 0;
for (int i = 0; i < n; i++) {
cout << lis[i] << " ";
if (vmax < lis[i]) {
vmax = lis[i];
imax = i;
}
}
cout << endl << vmax << endl;
for (int i = 0; i < n; i++) {
cout << p[i] << " ";
}
vector<int> res;
while (imax > -1) {
res.push_back(a[imax]);
imax = p[imax];
}
cout << endl;
for (int i = res.size()-1; i >= 0; i--) {
cout << res[i] << " ";
}
return 0;
}
```
# Session 6 - 2020 Oct 08, 19:30
```cpp=
// https://practice.geeksforgeeks.org/problems/longest-common-subsequence/0
#include <iostream>
#include <algorithm>
using namespace std;
int lcs(string s1, string s2, int n, int m) {
if (n == 0 || m == 0) return 0;
if (s1[n-1] == s2[m-1])
return 1 + lcs(s1, s2, n-1, m-1);
int l1 = lcs(s1, s2, n-1, m);
int l2 = lcs(s1, s2, n, m-1);
return max(l1, l2);
}
int lcs2(string s1, string s2, int n, int m) {
int dp[n+1][m+1]; // dp[i][j] = LCS(s1, s2, i, j)
for (int i = 0; i<=n; i++)
for (int j = 0; j<=m; j++) {
if (i == 0 || j==0) dp[i][j] = 0;
else if (s1[i-1] == s2[j-1]) {
dp[i][j] = 1 + dp[i-1][j-1];
} else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
return dp[n][m];
}
int main() {
int T;
cin >> T;
string s1, s2;
for (int i=0; i<T; i++) {
int n, m;
cin >> n >> m;
cin >> s1;
cin >> s2;
// cout << s1 << endl << s2 << endl;
cout << lcs2(s1, s2, n, m) << endl;
}
}
```
```cpp=
// https://practice.geeksforgeeks.org/problems/edit-distance3702/1
#include <iostream>
#include <algorithm>
using namespace std;
int ed(string s, string t, int n, int m) {
if (n==0) return m;
if (m==0) return n;
if (s[n-1] == t[m-1]) return ed(s, t, n-1, m-1);
return 1 + min(min(ed(s, t, n, m-1), ed(s, t, n-1, m)),
ed(s, t, n-1, m-1));
}
int ed2(string s, string t, int n, int m) {
int dp[n+1][m+1];
for (int i = 0; i<= n; i++)
for (int j = 0; j<= m; j++) {
if (i==0) dp[i][j] = j;
else if (j==0) dp[i][j] = i;
else if (s[i-1]==t[j-1]) dp[i][j] = dp[i-1][j-1];
else dp[i][j] = 1 + min(min(dp[i][j-1], dp[i-1][j]),
dp[i-1][j-1]);
}
return dp[n][m];
}
int main() {
string s, t;
cin >> s;
cin >> t;
cout << ed2(s, t, s.size(), t.size());
}
```