From 051d4f8614af6a30edcba7a90bf8edba9b052fd3 Mon Sep 17 00:00:00 2001 From: Yashwin Date: Sat, 12 Dec 2020 12:39:29 +0530 Subject: [PATCH 01/72] Directed Cycle detection added in C++ --- C-Plus-Plus/README.md | 1 + C-Plus-Plus/graphs/DirectedCycleDetection.cpp | 75 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 C-Plus-Plus/graphs/DirectedCycleDetection.cpp diff --git a/C-Plus-Plus/README.md b/C-Plus-Plus/README.md index faa021b138..f46fe2aed1 100644 --- a/C-Plus-Plus/README.md +++ b/C-Plus-Plus/README.md @@ -80,6 +80,7 @@ - [Pre-order (NLR) Tree Traversal](/graphs/Preorder_Traversal.cpp) - [Prim's Algorithm](graphs/Prim_Algorithm.cpp) - [Cycle Detection in Graph](graphs/detect_cycle.cpp) +- [Cycle Detection in a Directed Graph](graphs/DirectedCycleDetection.cpp) ## Searching diff --git a/C-Plus-Plus/graphs/DirectedCycleDetection.cpp b/C-Plus-Plus/graphs/DirectedCycleDetection.cpp new file mode 100644 index 0000000000..2641e4a9a7 --- /dev/null +++ b/C-Plus-Plus/graphs/DirectedCycleDetection.cpp @@ -0,0 +1,75 @@ +/** +Cycle detection in a directed graph +using dfs. Here, ststus array shows if +the node is in the path that we are +currently on. This is used to detect +any presence of back edges. +backegde present <=> cycle present +**/ + +#include +using namespace std; + +bool cycle; + +void dfs_visit(vector>& Graph, int src, vector& status, vector& visit) { + visit[src] = 1; + status[src] = 1; + for(int i = 0; i < Graph[src].size(); i++) + if(visit[Graph[src][i]] == 0) + dfs_visit(Graph, Graph[src][i], status, visit); + else + if(status[Graph[src][i]] == 1) + cycle = 1; + status[src] = 0; +} + +void dfs(vector>& Graph, int v, vector& status) { + vector visit(v); + for(int i = 0; i < v; i++) + if(visit[i] == 0) + dfs_visit(Graph, i, status, visit); +} + +void detect_cycle(vector>& Graph, int v) { + vector status(v); + dfs(Graph, v, status); + if(cycle == 0) + cout << "No cycle exits in the given graph \n"; + else + cout << "Cycle exists in the given graph \n"; +} + +int main() { + cycle = 0; + int v, e, a, b; + // all vertices are labelled from 0 to v-1 + cin >> v >> e; + vector> Graph(v); + // all directed edges + for(int i = 0; i < e; i++) { + cin >> a >> b; + // edge a -> b + Graph[a].push_back(b); + } + detect_cycle(Graph, v); + return 0; +} + +/** +Input : +6 8 +0 3 +0 4 +5 0 +1 5 +1 0 +2 1 +3 4 +4 5 +Output : +Cycle exists in the given graph + +Time Complexity : O(v+e) +Space Complexity : O(v) +**/ \ No newline at end of file From 8efb4c326e622964787487bbb1e38767ecc73475 Mon Sep 17 00:00:00 2001 From: Sidhan-Gupta Date: Sun, 13 Dec 2020 17:38:19 +0530 Subject: [PATCH 02/72] dutch national flag algo implemented --- .../other/SortColors-DutchNationalFlag.cpp | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp diff --git a/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp b/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp new file mode 100644 index 0000000000..7945494b69 --- /dev/null +++ b/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp @@ -0,0 +1,65 @@ +#include +using namespace std; +// +// PROBLEM STATEMENT + +// Given an array nums with n objects colored red, white, or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white, and blue. +// Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively. +// In simpler words sort an array containing 0,1,2. + +// Solve the problem with a one-pass algorithm using only O(1) constant space? + +// TEST CASE- +// Input: nums = [2,0,2,1,1,0] +// Output: [0,0,1,1,2,2] + +// Input: nums = [2,0,1] +// Output: [0,1,2] + +// The bruteforce approach - Sort the vector in nlogn time + +// ************************DUTCH_NATIONAL_FLAG ALGORITHM*********************************** + +void sortColors(vector nums) { + int n=nums.size(); + int low=0,med=0,high=n-1; // mantain 3 pointers + int temp; + while(med<=high){ // base condition-when med pointer becomes greater than high ,break + if(nums[med]==0){ + // swap(nums[med],nums[low]); + temp=nums[med]; + nums[med]=nums[low]; + nums[low]=temp; + low++; + med++; + } + else if(nums[med]==1){ + med++; + } + else{ + // swap(nums[med],nums[high]); + temp=nums[med]; + nums[med]=nums[high]; + nums[high]=temp; + high--; + } + } + for(int i=0;inums; + int n,input; + cin>>n; + for(int i=0;i>input; + nums.push_back(input); + } + sortColors(nums); + } + + // COMPLEXITY ANALYSIS- + // Time= O(N) + // space=O(1) \ No newline at end of file From 9297bd3005c8e2763cdbd66b9272204925aa011a Mon Sep 17 00:00:00 2001 From: Sidhan-Gupta Date: Sun, 13 Dec 2020 17:42:44 +0530 Subject: [PATCH 03/72] Dutch national flag algo implemented --- C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp b/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp index 7945494b69..b05a20ce5b 100644 --- a/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp +++ b/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp @@ -10,10 +10,14 @@ using namespace std; // Solve the problem with a one-pass algorithm using only O(1) constant space? // TEST CASE- -// Input: nums = [2,0,2,1,1,0] +// Input: +// n=6 +// nums = [2,0,2,1,1,0] // Output: [0,0,1,1,2,2] -// Input: nums = [2,0,1] +// Input: +// n=3 +// nums = [2,0,1] // Output: [0,1,2] // The bruteforce approach - Sort the vector in nlogn time From 81cd4b8b506fe1905b1959889dadda792c33b4ad Mon Sep 17 00:00:00 2001 From: Sejal-G Date: Mon, 14 Dec 2020 12:47:16 +0530 Subject: [PATCH 04/72] Add Caeser Cipher and Modified Caeser Cipher --- C-Plus-Plus/cryptography/Caeser_Cipher.cpp | 51 +++++++++++++++++ .../cryptography/Modified_Caeser_Cipher.cpp | 56 +++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 C-Plus-Plus/cryptography/Caeser_Cipher.cpp create mode 100644 C-Plus-Plus/cryptography/Modified_Caeser_Cipher.cpp diff --git a/C-Plus-Plus/cryptography/Caeser_Cipher.cpp b/C-Plus-Plus/cryptography/Caeser_Cipher.cpp new file mode 100644 index 0000000000..c8d97bf9f8 --- /dev/null +++ b/C-Plus-Plus/cryptography/Caeser_Cipher.cpp @@ -0,0 +1,51 @@ +//Caeser cipher + +/* +It is a type of susbtitution cipher which encrypts the plain text +message into a cipher text by simply replacing each letter +of a given text by a letter 3 places down the alphabet. + + +Example: +Text : TESSERACTCODING +Shift: 3 +Cipher: WHVVHUDFWFRGLQJ + +Text : NEOALGO +Shift: 3 +Cipher: QHRDOJR + +Time Complexity: O(n) +Space Complexity: O(n) + +Optimised method: +Change the plain text itself instead of initializing a new +string varibale if plain text is mutable. +Space complexity: O(1) +Time Complexity: O(n) + +*/ + +#include +using namespace std; + +int main(){ + + string plain,encrypt; + cout<<"Enter the plain text: "; + cin>>plain; + + encrypt=""; + int length = plain.length(); + for(int i=0;i97) + //lowercase letter + encrypt+=char((plain[i]-97+3)%26+97); + } + + cout< +using namespace std; + +int main(){ + + string plain,encrypt; + cout<<"Enter the plain text: "; + cin>>plain; + + int shift; + cout<<"Enter the integer key to shift: "; + cin>>shift; + + encrypt=""; + int length = plain.length(); + for(int i=0;i97) + //lowercase letter + encrypt+=char((plain[i]-97+shift)%26+97); + } + + cout< Date: Mon, 14 Dec 2020 12:48:51 +0530 Subject: [PATCH 05/72] Added NQueens in Java --- Java/README.md | 1 + Java/cp/NQueens.java | 61 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 Java/cp/NQueens.java diff --git a/Java/README.md b/Java/README.md index 8d9c665678..79e5093a51 100644 --- a/Java/README.md +++ b/Java/README.md @@ -54,6 +54,7 @@ _add list here_ - [Suduko Solver](cp/SudukoSolver.java) - [Ugly Number With Recursion](cp/UglyRecursion.java) - [PDDI Using Recursion](cp/ArmStrongRecursion.java) +- [NQueens Problem](cp/NQueens.java) ## Cryptography diff --git a/Java/cp/NQueens.java b/Java/cp/NQueens.java new file mode 100644 index 0000000000..ea566f6a60 --- /dev/null +++ b/Java/cp/NQueens.java @@ -0,0 +1,61 @@ +/** +N-Queens problem is a famous problem +The paradigm used to solve the problem is backtracking +**/ + +import java.io.*; +import java.util.*; + +public class NQueens { + + public static void solve(boolean[][] board, boolean[] cols, + boolean[] ndiag, boolean[] rdiag, int row, String asf) { + + if(row == board.length) { + System.out.println(asf+'.'); + return; + } + + for(int col=0; col Date: Mon, 14 Dec 2020 13:39:39 +0530 Subject: [PATCH 06/72] Added NQueens in C++ --- C-Plus-Plus/README.md | 1 + C-Plus-Plus/cp/NQueens.cpp | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 C-Plus-Plus/cp/NQueens.cpp diff --git a/C-Plus-Plus/README.md b/C-Plus-Plus/README.md index d43ef57238..a0e4bd37f9 100644 --- a/C-Plus-Plus/README.md +++ b/C-Plus-Plus/README.md @@ -43,6 +43,7 @@ - [Z Algorithm](cp/zalgorithm.cpp) - [ArraySub](cp/ARRAYSUB.cpp) - [Suduko Solver](cp/SudukoSolver.cpp) +- [NQueens](cp/NQueens.cpp) ## Data Structures diff --git a/C-Plus-Plus/cp/NQueens.cpp b/C-Plus-Plus/cp/NQueens.cpp new file mode 100644 index 0000000000..207dc1fe24 --- /dev/null +++ b/C-Plus-Plus/cp/NQueens.cpp @@ -0,0 +1,66 @@ +#include +using namespace std; + +#define N 20 + +/** +N-Queens problem is a famous problem +The paradigm used to solve the problem is backtracking +**/ + +void solve(bool board[N][N], bool cols[N], bool ndiag[2*N-1], bool rdiag[2*N-1], int row, string asf, int n) { + + if(row == n) { + cout << asf << '.' << '\n'; + return; + } + + for(int col=0; col> n; + + bool board[N][N]; + bool cols[N]; + bool ndiag[2*N-1], rdiag[2*N-1]; + + // initialize + for(int i = 0; i < n; i++) + for(int j = 0; j < n; j++) + board[i][j] = false; + + for(int i = 0; i < n; i++) + cols[i] = false; + + for(int i = 0; i < 2*n-1; i++) { + ndiag[i] = false; + rdiag[i] = false; + } + + solve(board, cols, ndiag, rdiag, 0, "", n); +} + +/** +Input : +4 +Output : +0-1, 1-3, 2-0, 3-2, . +0-2, 1-0, 2-3, 3-1, . +Space Complexity : O(n^2) +Time Complexity : upperbounded by O(n^n) +**/ \ No newline at end of file From 29d8f69aaa4b5bc5de54855722a774dcd94a0a57 Mon Sep 17 00:00:00 2001 From: Sejal-G Date: Mon, 14 Dec 2020 19:47:26 +0530 Subject: [PATCH 07/72] Add Homophonic Cipher in C++ --- .../cryptography/Homophonic_Cipher.cpp | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 C-Plus-Plus/cryptography/Homophonic_Cipher.cpp diff --git a/C-Plus-Plus/cryptography/Homophonic_Cipher.cpp b/C-Plus-Plus/cryptography/Homophonic_Cipher.cpp new file mode 100644 index 0000000000..a35f0e4078 --- /dev/null +++ b/C-Plus-Plus/cryptography/Homophonic_Cipher.cpp @@ -0,0 +1,90 @@ +//Homophonic Subsitution Cipher + +/* + +The Homophonic Substitution cipher is a substitution cipher in which single +plaintext letters can be replaced by any of several different ciphertext letters. +They are generally much more difficult to break than standard substitution ciphers. + +A B C D E F G H I J K L M N O P Q R S T U V W X Y Z +Q W E R T Y U I O P A S D F G H J K L Z X C V B N M +4 5 8 7 2 1 6 + 9 + 0 + + +Example: +Plain Text : TESSERACTCODING +Cipher Text: 60LL5KQEZE2R87U + +Plain Text : NeoAlgo +Cipher Text: 70gQsug + +Time Complexity: O(n) +Space Complexity: O(1) + +*/ + +#include +using namespace std; + +void mapping(vector > &code){ //Mapping one plain-text alphabet to more than one cipher-text alphabet. + code[0].push_back('Q');code[0].push_back('4'); + code[1].push_back('W'); + code[2].push_back('E'); + code[3].push_back('R'); + code[4].push_back('T');code[4].push_back('5');code[4].push_back('9');code[4].push_back('0'); + code[5].push_back('Y'); + code[6].push_back('U'); + code[7].push_back('I'); + code[8].push_back('O');code[8].push_back('8'); + code[9].push_back('P'); + code[10].push_back('A'); + code[11].push_back('S'); + code[12].push_back('D'); + code[13].push_back('F');code[13].push_back('7'); + code[14].push_back('G');code[14].push_back('2'); + code[15].push_back('H'); + code[16].push_back('J'); + code[17].push_back('K'); + code[18].push_back('L');code[18].push_back('1'); + code[19].push_back('Z');code[19].push_back('6'); + code[20].push_back('X'); + code[21].push_back('C'); + code[22].push_back('V'); + code[23].push_back('B'); + code[24].push_back('N'); + code[25].push_back('M'); +} + +int main(){ + + vector >code(26); + cout<<"HOMOPHONIC SUBSTITUTION TECHNIQUE\n\n"; + mapping(code); + + string plain,encrypted=""; + cout<<"Enter the plain text: "; + cin>>plain; + + int n = plain.length(); + for(int i=0;i=97){ //if lowercase + + int num = (rand() % (code[plain[i]-97].size())); + + if(code[plain[i]-97][num] >= 65) //if character + encrypted = encrypted+char(code[plain[i]-97][num]-65+97); + else //if numeral + encrypted = encrypted+code[plain[i]-97][num]; + } + else{ //if uppercase + int num = (rand() % (code[plain[i]-65].size())); + encrypted = encrypted+code[plain[i]-65][num]; + } + } + + cout<<"Encrypted Text: "< Date: Tue, 15 Dec 2020 04:30:24 +0530 Subject: [PATCH 08/72] Added Egg Dropping Problem --- C-Plus-Plus/dp/Egg_Dropping.cpp | 64 +++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 C-Plus-Plus/dp/Egg_Dropping.cpp diff --git a/C-Plus-Plus/dp/Egg_Dropping.cpp b/C-Plus-Plus/dp/Egg_Dropping.cpp new file mode 100644 index 0000000000..a609a1c882 --- /dev/null +++ b/C-Plus-Plus/dp/Egg_Dropping.cpp @@ -0,0 +1,64 @@ +//Egg Dropping problem +#include +using namespace std; + +int egg,flr; +int **table= NULL; +int min_probes=0; + +void input() +{ + cin>>egg; + cin>>flr; + table=new int*[flr+1]; //Initializing memory for DP Table + for(int i = 0; i <= egg; ++i) + table[i] = new int[flr+1]; + +} +int find_min_probes(int e,int f) +{ + + if(e==1) + return f; + + if(f==0||f==1) + return f; + + int probes=INT_MAX; + for(int k=1;k<=f;k++) + { + int temp=1+max(find_min_probes(e-1,k-1),find_min_probes(e,f-k)); + probes=min(probes,temp); + } + return probes; +} + +void display() +{ + cout<<"*************** Egg Droping Problem *****************"< Date: Tue, 15 Dec 2020 15:17:27 +0530 Subject: [PATCH 09/72] Added Josephus Problem in C++ --- C-Plus-Plus/README.md | 1 + C-Plus-Plus/cp/Josephus.cpp | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 C-Plus-Plus/cp/Josephus.cpp diff --git a/C-Plus-Plus/README.md b/C-Plus-Plus/README.md index d43ef57238..066ee7a3a0 100644 --- a/C-Plus-Plus/README.md +++ b/C-Plus-Plus/README.md @@ -43,6 +43,7 @@ - [Z Algorithm](cp/zalgorithm.cpp) - [ArraySub](cp/ARRAYSUB.cpp) - [Suduko Solver](cp/SudukoSolver.cpp) +- [Josephus Problem](cp/Josephus.cpp) ## Data Structures diff --git a/C-Plus-Plus/cp/Josephus.cpp b/C-Plus-Plus/cp/Josephus.cpp new file mode 100644 index 0000000000..f9721a0a65 --- /dev/null +++ b/C-Plus-Plus/cp/Josephus.cpp @@ -0,0 +1,35 @@ +/** +Josephus problem is a famous problem. +In each iteration we kill the every kth +person in a circular arrangement of n persons. +Find the person who is alive at the end. +0-based indexing +**/ + +#include +using namespace std; + +int solution(int n, int k){ + if(n == 1) + return 0; + return (k+solution(n-1,k))%n; +} + +int main() { + int n, k; + cin >> n; + cout << solution(n,k) << '\n'; + return 0; +} + +/** + +Input : +4 2 +Output : +0 + +Time Complexity : O(n) +Space Complexity : O(1) + +**/ \ No newline at end of file From 391d589edb141d89ddd7ed4ba9958be129ac1d50 Mon Sep 17 00:00:00 2001 From: Yashwin Date: Tue, 15 Dec 2020 20:45:48 +0530 Subject: [PATCH 10/72] Added all requested changes --- C-Plus-Plus/graphs/DirectedCycleDetection.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/C-Plus-Plus/graphs/DirectedCycleDetection.cpp b/C-Plus-Plus/graphs/DirectedCycleDetection.cpp index 2641e4a9a7..d6a5329df2 100644 --- a/C-Plus-Plus/graphs/DirectedCycleDetection.cpp +++ b/C-Plus-Plus/graphs/DirectedCycleDetection.cpp @@ -13,7 +13,9 @@ using namespace std; bool cycle; void dfs_visit(vector>& Graph, int src, vector& status, vector& visit) { + // mark the node as visited visit[src] = 1; + // mark the node saying that it is in the current path status[src] = 1; for(int i = 0; i < Graph[src].size(); i++) if(visit[Graph[src][i]] == 0) @@ -21,11 +23,14 @@ void dfs_visit(vector>& Graph, int src, vector& status, vector else if(status[Graph[src][i]] == 1) cycle = 1; + // unmark the node saying the path which contains the node is done status[src] = 0; } void dfs(vector>& Graph, int v, vector& status) { + // initially mark all nodes as not visited vector visit(v); + // go on visiting each not visited node for(int i = 0; i < v; i++) if(visit[i] == 0) dfs_visit(Graph, i, status, visit); From 94a94316c46707dbacd22efab2f0532e6dc7c81b Mon Sep 17 00:00:00 2001 From: Sidhan-Gupta Date: Tue, 15 Dec 2020 22:35:19 +0530 Subject: [PATCH 11/72] link to the problem added --- C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp b/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp index b05a20ce5b..3e7f2de86e 100644 --- a/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp +++ b/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp @@ -1,7 +1,7 @@ #include using namespace std; // -// PROBLEM STATEMENT +// PROBLEM STATEMENT- https://leetcode.com/problems/sort-colors/ // Given an array nums with n objects colored red, white, or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white, and blue. // Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively. From 531eb8b45ad2dcc8a02f6b3108bbe2d39494fb51 Mon Sep 17 00:00:00 2001 From: Rajiv Singh Date: Wed, 16 Dec 2020 19:32:09 +0530 Subject: [PATCH 12/72] formatted code --- C-Plus-Plus/graphs/DirectedCycleDetection.cpp | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/C-Plus-Plus/graphs/DirectedCycleDetection.cpp b/C-Plus-Plus/graphs/DirectedCycleDetection.cpp index d6a5329df2..94774f0e9f 100644 --- a/C-Plus-Plus/graphs/DirectedCycleDetection.cpp +++ b/C-Plus-Plus/graphs/DirectedCycleDetection.cpp @@ -1,10 +1,7 @@ /** Cycle detection in a directed graph -using dfs. Here, ststus array shows if -the node is in the path that we are -currently on. This is used to detect -any presence of back edges. -backegde present <=> cycle present +using DFS. Here, status array shows if the node is in the path that we are currently on. This is used to detect any presence of back edges. +backedge present <=> cycle present **/ #include @@ -17,29 +14,28 @@ void dfs_visit(vector>& Graph, int src, vector& status, vector visit[src] = 1; // mark the node saying that it is in the current path status[src] = 1; - for(int i = 0; i < Graph[src].size(); i++) - if(visit[Graph[src][i]] == 0) - dfs_visit(Graph, Graph[src][i], status, visit); - else - if(status[Graph[src][i]] == 1) - cycle = 1; + for (int i = 0; i < Graph[src].size(); i++) + if (visit[Graph[src][i]] == 0) + dfs_visit(Graph, Graph[src][i], status, visit); + else if (status[Graph[src][i]] == 1) + cycle = 1; // unmark the node saying the path which contains the node is done - status[src] = 0; + status[src] = 0; } void dfs(vector>& Graph, int v, vector& status) { // initially mark all nodes as not visited vector visit(v); // go on visiting each not visited node - for(int i = 0; i < v; i++) - if(visit[i] == 0) + for (int i = 0; i < v; i++) + if (visit[i] == 0) dfs_visit(Graph, i, status, visit); } void detect_cycle(vector>& Graph, int v) { vector status(v); dfs(Graph, v, status); - if(cycle == 0) + if (cycle == 0) cout << "No cycle exits in the given graph \n"; else cout << "Cycle exists in the given graph \n"; @@ -52,11 +48,11 @@ int main() { cin >> v >> e; vector> Graph(v); // all directed edges - for(int i = 0; i < e; i++) { + for (int i = 0; i < e; i++) { cin >> a >> b; // edge a -> b Graph[a].push_back(b); - } + } detect_cycle(Graph, v); return 0; } @@ -77,4 +73,4 @@ Cycle exists in the given graph Time Complexity : O(v+e) Space Complexity : O(v) -**/ \ No newline at end of file +**/ From e7a7ff67a7c02df2797541bb588e60e3470d725c Mon Sep 17 00:00:00 2001 From: Sejal-G Date: Wed, 16 Dec 2020 20:21:43 +0530 Subject: [PATCH 13/72] Reformat the code to make it more reusable --- C-Plus-Plus/cryptography/Caeser_Cipher.cpp | 21 +++++++++----- .../cryptography/Homophonic_Cipher.cpp | 25 +++++++++++----- .../cryptography/Modified_Caeser_Cipher.cpp | 29 ++++++++++++------- 3 files changed, 49 insertions(+), 26 deletions(-) diff --git a/C-Plus-Plus/cryptography/Caeser_Cipher.cpp b/C-Plus-Plus/cryptography/Caeser_Cipher.cpp index c8d97bf9f8..ad42ad8064 100644 --- a/C-Plus-Plus/cryptography/Caeser_Cipher.cpp +++ b/C-Plus-Plus/cryptography/Caeser_Cipher.cpp @@ -29,13 +29,9 @@ Time Complexity: O(n) #include using namespace std; -int main(){ +string encode(string plain){ - string plain,encrypt; - cout<<"Enter the plain text: "; - cin>>plain; - - encrypt=""; + string encrypt=""; int length = plain.length(); for(int i=0;i>plain; - cout< > &code){ //Mapping one plain-text alphabet code[25].push_back('M'); } -int main(){ +string encode(string plain){ vector >code(26); - cout<<"HOMOPHONIC SUBSTITUTION TECHNIQUE\n\n"; mapping(code); - string plain,encrypted=""; - cout<<"Enter the plain text: "; - cin>>plain; - + string encrypted = ""; int n = plain.length(); for(int i=0;i=97){ //if lowercase @@ -84,7 +80,20 @@ int main(){ } } - cout<<"Encrypted Text: "< >code(26); + mapping(code); + + string plain,encrypt; + cout<<"Enter the plain text: "; + cin>>plain; + + encrypt = encode(plain); + cout<<"Cipher Text: "< using namespace std; -int main(){ +string encode(string plain, int shift){ - string plain,encrypt; - cout<<"Enter the plain text: "; - cin>>plain; - - int shift; - cout<<"Enter the integer key to shift: "; - cin>>shift; - - encrypt=""; + string encrypt=""; int length = plain.length(); for(int i=0;i>plain; + + cout<<"Enter the integer key to shift: "; + cin>>shift; + + encrypt = encode(plain,shift); + cout<<"Cipher Text: "< Date: Wed, 16 Dec 2020 20:59:04 +0530 Subject: [PATCH 14/72] Variables names changed --- C-Plus-Plus/graphs/DirectedCycleDetection.cpp | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/C-Plus-Plus/graphs/DirectedCycleDetection.cpp b/C-Plus-Plus/graphs/DirectedCycleDetection.cpp index 94774f0e9f..fa3db56621 100644 --- a/C-Plus-Plus/graphs/DirectedCycleDetection.cpp +++ b/C-Plus-Plus/graphs/DirectedCycleDetection.cpp @@ -23,18 +23,18 @@ void dfs_visit(vector>& Graph, int src, vector& status, vector status[src] = 0; } -void dfs(vector>& Graph, int v, vector& status) { +void dfs(vector>& Graph, int vertex, vector& status) { // initially mark all nodes as not visited - vector visit(v); + vector visit(vertex); // go on visiting each not visited node - for (int i = 0; i < v; i++) + for (int i = 0; i < vertex; i++) if (visit[i] == 0) dfs_visit(Graph, i, status, visit); } -void detect_cycle(vector>& Graph, int v) { - vector status(v); - dfs(Graph, v, status); +void detect_cycle(vector>& Graph, int vertex) { + vector status(vertex); + dfs(Graph, vertex, status); if (cycle == 0) cout << "No cycle exits in the given graph \n"; else @@ -43,17 +43,17 @@ void detect_cycle(vector>& Graph, int v) { int main() { cycle = 0; - int v, e, a, b; + int vertex, edge, a, b; // all vertices are labelled from 0 to v-1 - cin >> v >> e; - vector> Graph(v); + cin >> vertex >> edge; + vector> Graph(vertex); // all directed edges - for (int i = 0; i < e; i++) { + for (int i = 0; i < edge; i++) { cin >> a >> b; // edge a -> b Graph[a].push_back(b); } - detect_cycle(Graph, v); + detect_cycle(Graph, vertex); return 0; } From 9bd9fd0a2a5d33bfee39dc0448565704addb1f4e Mon Sep 17 00:00:00 2001 From: Yashwin Date: Wed, 16 Dec 2020 21:14:49 +0530 Subject: [PATCH 15/72] Requested changes done --- C-Plus-Plus/cp/NQueens.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/C-Plus-Plus/cp/NQueens.cpp b/C-Plus-Plus/cp/NQueens.cpp index 207dc1fe24..dbcd3f52d8 100644 --- a/C-Plus-Plus/cp/NQueens.cpp +++ b/C-Plus-Plus/cp/NQueens.cpp @@ -1,12 +1,14 @@ -#include -using namespace std; - -#define N 20 - /** N-Queens problem is a famous problem The paradigm used to solve the problem is backtracking +The problem is to find a way to place n queens on nXn board +such that no queen can kill the other **/ + +#include +using namespace std; + +#define N 20 void solve(bool board[N][N], bool cols[N], bool ndiag[2*N-1], bool rdiag[2*N-1], int row, string asf, int n) { @@ -18,11 +20,13 @@ void solve(bool board[N][N], bool cols[N], bool ndiag[2*N-1], bool rdiag[2*N-1], for(int col=0; col Date: Wed, 16 Dec 2020 21:27:17 +0530 Subject: [PATCH 16/72] Requested changes done --- Java/cp/NQueens.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Java/cp/NQueens.java b/Java/cp/NQueens.java index ea566f6a60..ce5a609caa 100644 --- a/Java/cp/NQueens.java +++ b/Java/cp/NQueens.java @@ -1,6 +1,8 @@ /** N-Queens problem is a famous problem The paradigm used to solve the problem is backtracking +The problem is to find a way to place n queens on nXn board +such that no queen can kill the other **/ import java.io.*; @@ -19,11 +21,13 @@ public static void solve(boolean[][] board, boolean[] cols, for(int col=0; col Date: Wed, 16 Dec 2020 22:01:49 +0530 Subject: [PATCH 17/72] Added the solution for Count ways to N'th Stair. issue #1455 I have included Time and space complexity, Comments, output , description. Please let me know if any changes are required. --- Java/cp/Staircase_problem.java | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Java/cp/Staircase_problem.java diff --git a/Java/cp/Staircase_problem.java b/Java/cp/Staircase_problem.java new file mode 100644 index 0000000000..23f12ce080 --- /dev/null +++ b/Java/cp/Staircase_problem.java @@ -0,0 +1,38 @@ +// This program finds the total number of possible combinations that can be used to +// climb statirs . EG : for 3 stairs ,combination and output will be 1,1,1 , 1,2 , 2,1 i.e 3 . +import java.util.Scanner; + +class Staircase_problem{ + public static void main(String args[]){ + int count_stairs=0; + Scanner input = new Scanner(System.in); + //Asking for number of steps to find combination. + System.out.println("Enter total number of Stairs:"); + count_stairs = input.nextInt(); + Staircase_problem sp = new Staircase_problem(); + // Making object of this class and passing stair number to the function. + int final_steps = sp.possibilities_count(count_stairs); + //Printing the number of combination which is given by the function. + System.out.println("Total Number of possible Combinations = "+final_steps); + } + + int possibilities_count(int a){ + int result = a; + //Using Recursion to find the total number of stairs as f(a) = f(a-1) + a(a-2) + // where f(a) is the final result + if(result <= 1){ + result = 1; + }else{ + result = possibilities_count(a-1) + possibilities_count(a-2); + } + return result; + } +} +/* Output +Enter total number of Stairs: +4 +Total Number of possible Combinations = 5 +*/ +// Time Complexity : O(2^n) +// Space Complexity :O(1) +// Created by Shubham Patel on 16-12-2020 on WoC \ No newline at end of file From b2286e8a94d55ee2161025c84c33670dc18314c7 Mon Sep 17 00:00:00 2001 From: Shubham Patel Date: Wed, 16 Dec 2020 22:15:31 +0530 Subject: [PATCH 18/72] Added solution to Staircase Problem in Readme --- Java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Java/README.md b/Java/README.md index 7d642d5242..98fb66a13f 100644 --- a/Java/README.md +++ b/Java/README.md @@ -38,6 +38,7 @@ _add list here_ - [Remove Duplicate Element from an array without using Extra Space](cp/RemoveDuplicateElementWithoutExtraSpace.java) - [Spiral Matrix](cp/Spiral_Matrix.java) - [String to Int(atoi)](cp/String_to_int.java>) +- [Count Ways to Nth Stair](cp/Staircase_problem.java) - [Longest Common Prefix](cp/Longest_Common_Prefix.java) - [Target Sum Triplets](cp/target_sum_triplets.java) - [Check for Subsequence](cp/CheckForSubSequence.java) From be4ff6aaa69e2b77ca46e1d681d814eeac2507b9 Mon Sep 17 00:00:00 2001 From: Shubham Patel Date: Wed, 16 Dec 2020 23:12:43 +0530 Subject: [PATCH 19/72] Added solution for Count ways to nth stair issue #1455 --- Python/cp/Staircase_problem.java | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Python/cp/Staircase_problem.java diff --git a/Python/cp/Staircase_problem.java b/Python/cp/Staircase_problem.java new file mode 100644 index 0000000000..23f12ce080 --- /dev/null +++ b/Python/cp/Staircase_problem.java @@ -0,0 +1,38 @@ +// This program finds the total number of possible combinations that can be used to +// climb statirs . EG : for 3 stairs ,combination and output will be 1,1,1 , 1,2 , 2,1 i.e 3 . +import java.util.Scanner; + +class Staircase_problem{ + public static void main(String args[]){ + int count_stairs=0; + Scanner input = new Scanner(System.in); + //Asking for number of steps to find combination. + System.out.println("Enter total number of Stairs:"); + count_stairs = input.nextInt(); + Staircase_problem sp = new Staircase_problem(); + // Making object of this class and passing stair number to the function. + int final_steps = sp.possibilities_count(count_stairs); + //Printing the number of combination which is given by the function. + System.out.println("Total Number of possible Combinations = "+final_steps); + } + + int possibilities_count(int a){ + int result = a; + //Using Recursion to find the total number of stairs as f(a) = f(a-1) + a(a-2) + // where f(a) is the final result + if(result <= 1){ + result = 1; + }else{ + result = possibilities_count(a-1) + possibilities_count(a-2); + } + return result; + } +} +/* Output +Enter total number of Stairs: +4 +Total Number of possible Combinations = 5 +*/ +// Time Complexity : O(2^n) +// Space Complexity :O(1) +// Created by Shubham Patel on 16-12-2020 on WoC \ No newline at end of file From 9f9f7b80c2fb51639e211489ae3e660256a0aabc Mon Sep 17 00:00:00 2001 From: Shubham Patel Date: Wed, 16 Dec 2020 23:17:07 +0530 Subject: [PATCH 20/72] Added hyperlink to the README (#14) --- Python/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Python/README.md b/Python/README.md index 0ea3c143b0..328e32ac14 100644 --- a/Python/README.md +++ b/Python/README.md @@ -78,6 +78,7 @@ - [Maximum sum rectangle](cp/max_sum.py) - [Maximum Water Container](cp/Maximum_Water_Container.py) - [Smallest sum subarray](cp/smallest_sum_array.py) +- [Count ways to Nth stair(Staircse Problem)](cp/staircase_problem.py) - [Delete a node from linked list](cp/delete_node.py) - [Rain Water Harvesting](cp/rainwater_harvesting.py) - [Search Insert Position](cp/search_insert_position.py) From d42e3e93ecd54a8f9fd56dc094d1428303878443 Mon Sep 17 00:00:00 2001 From: Shubham Patel Date: Wed, 16 Dec 2020 23:32:12 +0530 Subject: [PATCH 21/72] Updated the code --- Python/cp/Staircase_problem.java | 38 -------------------------------- Python/cp/staircase_problem.py | 27 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 38 deletions(-) delete mode 100644 Python/cp/Staircase_problem.java create mode 100644 Python/cp/staircase_problem.py diff --git a/Python/cp/Staircase_problem.java b/Python/cp/Staircase_problem.java deleted file mode 100644 index 23f12ce080..0000000000 --- a/Python/cp/Staircase_problem.java +++ /dev/null @@ -1,38 +0,0 @@ -// This program finds the total number of possible combinations that can be used to -// climb statirs . EG : for 3 stairs ,combination and output will be 1,1,1 , 1,2 , 2,1 i.e 3 . -import java.util.Scanner; - -class Staircase_problem{ - public static void main(String args[]){ - int count_stairs=0; - Scanner input = new Scanner(System.in); - //Asking for number of steps to find combination. - System.out.println("Enter total number of Stairs:"); - count_stairs = input.nextInt(); - Staircase_problem sp = new Staircase_problem(); - // Making object of this class and passing stair number to the function. - int final_steps = sp.possibilities_count(count_stairs); - //Printing the number of combination which is given by the function. - System.out.println("Total Number of possible Combinations = "+final_steps); - } - - int possibilities_count(int a){ - int result = a; - //Using Recursion to find the total number of stairs as f(a) = f(a-1) + a(a-2) - // where f(a) is the final result - if(result <= 1){ - result = 1; - }else{ - result = possibilities_count(a-1) + possibilities_count(a-2); - } - return result; - } -} -/* Output -Enter total number of Stairs: -4 -Total Number of possible Combinations = 5 -*/ -// Time Complexity : O(2^n) -// Space Complexity :O(1) -// Created by Shubham Patel on 16-12-2020 on WoC \ No newline at end of file diff --git a/Python/cp/staircase_problem.py b/Python/cp/staircase_problem.py new file mode 100644 index 0000000000..75d964797e --- /dev/null +++ b/Python/cp/staircase_problem.py @@ -0,0 +1,27 @@ +## This program finds the total number of possible combinations that can be used to +## climb statirs . EG : for 3 stairs ,combination and output will be 1,1,1 , 1,2 , 2,1 i.e 3 . + +def counting_stairs(stair_number): + result = stair_number + ##Using Recursion to find the total number of stairs as f(a) = f(a-1) + a(a-2) + ## where f(a) is the final result + if(stair_number <=1): + result = 1 + else: + result = (counting_stairs(stair_number-1) + counting_stairs(stair_number-2)) + return result + +##Asking for number of steps to find combination. +count_stair = int(input("Enter total number of stairs: ")) +##passing stair number to the function. +##Printing the number of combination which is given by the function. +print(f"Total Number of possible Combinations = {counting_stairs(count_stair)}") + + +## Output +## Enter total number of stairs: 5 +## Total Number of possible Combinations = 8 + +## Time Complexity : O(2^n) +## Space Complexity :O(1) +## Created by Shubham Patel on 16-12-2020 on WoC From 019506902d43fc52b4694720030c221dc47c36d3 Mon Sep 17 00:00:00 2001 From: gargVader Date: Thu, 17 Dec 2020 14:22:37 +0530 Subject: [PATCH 22/72] Added balanced paranthesis --- C-Plus-Plus/README.md | 1 + .../other/Check_for_balanced_parenthesis.cpp | 64 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 C-Plus-Plus/other/Check_for_balanced_parenthesis.cpp diff --git a/C-Plus-Plus/README.md b/C-Plus-Plus/README.md index 963533c929..50c17cf30a 100644 --- a/C-Plus-Plus/README.md +++ b/C-Plus-Plus/README.md @@ -173,3 +173,4 @@ _add list here_ - [Kth smallest element](other/Kth_smallest_element.cpp) - [Generate all Subsets](other/subsets.cpp) - [Convex Hull (Jarvis' Algorithm)](other/Convex_Hull_Jarvis_Algorithm.cpp) +- [Check for balanced paranthesis](other/Check_for_balanced_parenthesis.cpp) diff --git a/C-Plus-Plus/other/Check_for_balanced_parenthesis.cpp b/C-Plus-Plus/other/Check_for_balanced_parenthesis.cpp new file mode 100644 index 0000000000..9853eb2ad4 --- /dev/null +++ b/C-Plus-Plus/other/Check_for_balanced_parenthesis.cpp @@ -0,0 +1,64 @@ +/* +Check for balanced paranthesis +============================== +Given an expression containing paranthesis, check if it is well-formed or balanced + +Application: Stack data structure +*/ + +#include +#include +using namespace std; + +int main() { + + // Input the string + string str; cin >> str; + // Size of the string + int n = str.size(); + + // Stack to store open paranthesis + stack s; + // Open paranthesis -> 1 + + // Loop through characters in the string + for (int i = 0; i < n; i++) { + // Open paranthesis is always pushed into the stack + if (str[i] == '(') { + s.push(1); + } else if (str[i] == ')') { + // Closed paranthesis encountered must be balanced by an open paranthesis already + // present in the stack + if (!s.empty()) { + // Stack contains open paranthesis, one of which has been balanced + // Pop one paranthesis out + s.pop(); + } else { + // Stack contains no open paranthesis. So closed paranthesis cannot be balanced + cout << "No" << endl; + return 0; + } + } + } + + // Check if we have open paranthesis remaining + if (s.size()) { + cout << "No" << endl; + } else { + cout << "Yes" << endl; + } +} + +/* +Input: +((a+b)+(c-d+f)) + +Output: +Yes + +Input: +((a+b)+(c-d+f))) + +Output: +No +*/ \ No newline at end of file From d45d8b58991c1b63fe4da2b82078b29212056367 Mon Sep 17 00:00:00 2001 From: gargVader Date: Thu, 17 Dec 2020 14:30:32 +0530 Subject: [PATCH 23/72] Fixed typo --- C-Plus-Plus/README.md | 2 +- .../other/Check_for_balanced_parenthesis.cpp | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/C-Plus-Plus/README.md b/C-Plus-Plus/README.md index 50c17cf30a..d82cf912cb 100644 --- a/C-Plus-Plus/README.md +++ b/C-Plus-Plus/README.md @@ -173,4 +173,4 @@ _add list here_ - [Kth smallest element](other/Kth_smallest_element.cpp) - [Generate all Subsets](other/subsets.cpp) - [Convex Hull (Jarvis' Algorithm)](other/Convex_Hull_Jarvis_Algorithm.cpp) -- [Check for balanced paranthesis](other/Check_for_balanced_parenthesis.cpp) +- [Check for balanced parenthesis](other/Check_for_balanced_parenthesis.cpp) diff --git a/C-Plus-Plus/other/Check_for_balanced_parenthesis.cpp b/C-Plus-Plus/other/Check_for_balanced_parenthesis.cpp index 9853eb2ad4..12c5b25926 100644 --- a/C-Plus-Plus/other/Check_for_balanced_parenthesis.cpp +++ b/C-Plus-Plus/other/Check_for_balanced_parenthesis.cpp @@ -1,7 +1,7 @@ /* -Check for balanced paranthesis +Check for balanced parenthesis ============================== -Given an expression containing paranthesis, check if it is well-formed or balanced +Given an expression containing parenthesis, check if it is well-formed or balanced Application: Stack data structure */ @@ -17,31 +17,31 @@ int main() { // Size of the string int n = str.size(); - // Stack to store open paranthesis + // Stack to store open parenthesis stack s; - // Open paranthesis -> 1 + // Open parenthesis -> 1 // Loop through characters in the string for (int i = 0; i < n; i++) { - // Open paranthesis is always pushed into the stack + // Open parenthesis is always pushed into the stack if (str[i] == '(') { s.push(1); } else if (str[i] == ')') { - // Closed paranthesis encountered must be balanced by an open paranthesis already + // Closed parenthesis encountered must be balanced by an open parenthesis already // present in the stack if (!s.empty()) { - // Stack contains open paranthesis, one of which has been balanced - // Pop one paranthesis out + // Stack contains open parenthesis, one of which has been balanced + // Pop one parenthesis out s.pop(); } else { - // Stack contains no open paranthesis. So closed paranthesis cannot be balanced + // Stack contains no open parenthesis. So closed parenthesis cannot be balanced cout << "No" << endl; return 0; } } } - // Check if we have open paranthesis remaining + // Check if we have open parenthesis remaining if (s.size()) { cout << "No" << endl; } else { From 712cf0762ed8e349559508a65e1d19ebdd356c13 Mon Sep 17 00:00:00 2001 From: Rajiv Singh Date: Thu, 17 Dec 2020 16:17:52 +0530 Subject: [PATCH 24/72] Update DirectedCycleDetection.cpp --- C-Plus-Plus/graphs/DirectedCycleDetection.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/C-Plus-Plus/graphs/DirectedCycleDetection.cpp b/C-Plus-Plus/graphs/DirectedCycleDetection.cpp index fa3db56621..07a85f1270 100644 --- a/C-Plus-Plus/graphs/DirectedCycleDetection.cpp +++ b/C-Plus-Plus/graphs/DirectedCycleDetection.cpp @@ -71,6 +71,6 @@ Input : Output : Cycle exists in the given graph -Time Complexity : O(v+e) -Space Complexity : O(v) +Time Complexity : O(vertex+edge) +Space Complexity : O(vertex) **/ From eba6d1277a6b4b6a4383835d5d03b0af20e00bc7 Mon Sep 17 00:00:00 2001 From: Shubham Patel Date: Fri, 18 Dec 2020 10:54:23 +0530 Subject: [PATCH 25/72] Formatted the code . --- Python/cp/staircase_problem.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/Python/cp/staircase_problem.py b/Python/cp/staircase_problem.py index 75d964797e..e838f161f4 100644 --- a/Python/cp/staircase_problem.py +++ b/Python/cp/staircase_problem.py @@ -1,27 +1,25 @@ -## This program finds the total number of possible combinations that can be used to -## climb statirs . EG : for 3 stairs ,combination and output will be 1,1,1 , 1,2 , 2,1 i.e 3 . +"""This program finds the total number of possible combinations that can be used to + climb statirs . EG : for 3 stairs ,combination and output will be 1,1,1 , 1,2 , 2,1 i.e 3 . """ def counting_stairs(stair_number): result = stair_number - ##Using Recursion to find the total number of stairs as f(a) = f(a-1) + a(a-2) - ## where f(a) is the final result + # This function uses Recursion. if(stair_number <=1): result = 1 else: result = (counting_stairs(stair_number-1) + counting_stairs(stair_number-2)) return result -##Asking for number of steps to find combination. -count_stair = int(input("Enter total number of stairs: ")) -##passing stair number to the function. -##Printing the number of combination which is given by the function. -print(f"Total Number of possible Combinations = {counting_stairs(count_stair)}") +if __name__ == '__main__': + count_stair = int(input("Enter total number of stairs: ")) + print(f"Total Number of possible Combinations = {counting_stairs(count_stair)}") -## Output -## Enter total number of stairs: 5 -## Total Number of possible Combinations = 8 +"""Output +Total Number of possible Combinations = 8 +Enter total number of stairs: 5 -## Time Complexity : O(2^n) -## Space Complexity :O(1) -## Created by Shubham Patel on 16-12-2020 on WoC +Time Complexity : O(2^n) +Space Complexity :O(1) +Created by Shubham Patel on 16-12-2020 on WoC +""" From c6aeffbe7341aef02b0e10d0f1b266b5fd9940eb Mon Sep 17 00:00:00 2001 From: Shubham Patel Date: Fri, 18 Dec 2020 11:34:35 +0530 Subject: [PATCH 26/72] Formatted code --- Java/cp/Staircase_problem.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/Java/cp/Staircase_problem.java b/Java/cp/Staircase_problem.java index 23f12ce080..c8c3e3cb39 100644 --- a/Java/cp/Staircase_problem.java +++ b/Java/cp/Staircase_problem.java @@ -1,25 +1,22 @@ -// This program finds the total number of possible combinations that can be used to -// climb statirs . EG : for 3 stairs ,combination and output will be 1,1,1 , 1,2 , 2,1 i.e 3 . +/*This program finds the total number of possible combinations that can be used to +climb statirs . EG : for 3 stairs ,combination and output will be 1,1,1 , 1,2 , 2,1 i.e 3 . */ import java.util.Scanner; class Staircase_problem{ public static void main(String args[]){ int count_stairs=0; Scanner input = new Scanner(System.in); - //Asking for number of steps to find combination. System.out.println("Enter total number of Stairs:"); count_stairs = input.nextInt(); Staircase_problem sp = new Staircase_problem(); - // Making object of this class and passing stair number to the function. int final_steps = sp.possibilities_count(count_stairs); - //Printing the number of combination which is given by the function. System.out.println("Total Number of possible Combinations = "+final_steps); } int possibilities_count(int a){ int result = a; - //Using Recursion to find the total number of stairs as f(a) = f(a-1) + a(a-2) - // where f(a) is the final result + /*Using Recursion to find the total number of stairs as f(a) = f(a-1) + a(a-2) + where f(a) is the final result */ if(result <= 1){ result = 1; }else{ @@ -35,4 +32,4 @@ int possibilities_count(int a){ */ // Time Complexity : O(2^n) // Space Complexity :O(1) -// Created by Shubham Patel on 16-12-2020 on WoC \ No newline at end of file +// Created by Shubham Patel on 16-12-2020 on WoC From 6bdfbc50704a2d27206d8416fd1f1321456a2a66 Mon Sep 17 00:00:00 2001 From: gargVader Date: Sun, 20 Dec 2020 11:04:15 +0530 Subject: [PATCH 27/72] isBalanced(), eg added --- .../other/Check_for_balanced_parenthesis.cpp | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/C-Plus-Plus/other/Check_for_balanced_parenthesis.cpp b/C-Plus-Plus/other/Check_for_balanced_parenthesis.cpp index 12c5b25926..ff87c40dd9 100644 --- a/C-Plus-Plus/other/Check_for_balanced_parenthesis.cpp +++ b/C-Plus-Plus/other/Check_for_balanced_parenthesis.cpp @@ -1,19 +1,19 @@ /* Check for balanced parenthesis ============================== -Given an expression containing parenthesis, check if it is well-formed or balanced +Given an expression containing parenthesis, check if it is well-formed or balanced. +Example of balanced parenthesis are: (), ((())), (a+b), (a/b)*(b/a) Application: Stack data structure +Time Complexity: O(n) +Space Complexity: O(n) */ #include #include using namespace std; -int main() { - - // Input the string - string str; cin >> str; +bool isBalanced(string str) { // Size of the string int n = str.size(); @@ -35,7 +35,6 @@ int main() { s.pop(); } else { // Stack contains no open parenthesis. So closed parenthesis cannot be balanced - cout << "No" << endl; return 0; } } @@ -43,12 +42,21 @@ int main() { // Check if we have open parenthesis remaining if (s.size()) { - cout << "No" << endl; + return 0; } else { - cout << "Yes" << endl; + return 1; } } +int main() { + + // Input the string + string str; cin >> str; + + if (isBalanced(str)) cout << "Yes"; + else cout << "No"; +} + /* Input: ((a+b)+(c-d+f)) From b6901539c131b5030c77e43694b433aa75522033 Mon Sep 17 00:00:00 2001 From: itsIapetus <75844962+itsIapetus@users.noreply.github.com> Date: Sun, 20 Dec 2020 11:43:42 +0530 Subject: [PATCH 28/72] Create Interpolation_search.go --- Go/search/Interpolation_search.go | 57 +++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 Go/search/Interpolation_search.go diff --git a/Go/search/Interpolation_search.go b/Go/search/Interpolation_search.go new file mode 100644 index 0000000000..989d3c2283 --- /dev/null +++ b/Go/search/Interpolation_search.go @@ -0,0 +1,57 @@ +package main +import "fmt" + +func Search(array []int, num int) int { + + min := array[0] + max := array[len(array)-1] + + low := 0 + high := len(array)-1 + + for { + if num < min { + return low + } + + if num > max { + return high + 1 + } + + var guess int + if high == low { + guess = high + } else { + size := high - low + key := int(float64(size-1) * (float64(num-min) / float64(max-min))) + guess = low + key + } + + if array[guess] == num { + for guess > 0 && array[guess-1] == num { + guess-- + } + return guess + } + + if array[guess] > num { + high = guess - 1 + max = array[high] + } else { + low = guess + 1 + min = array[low] + } + } +} + +// Test Case + +func main(){ + items := []int{1, 12, 24, 34, 43, 57, 60, 72} + fmt.Println(Search(items,34)) +} + +// Output = 3 + +// Time Complexity = O(n) +// Space Complexity = O(n) From 5be94f60992eb3dc29a1f6bec4260cc475dd0ed3 Mon Sep 17 00:00:00 2001 From: itsIapetus <75844962+itsIapetus@users.noreply.github.com> Date: Sun, 20 Dec 2020 11:44:43 +0530 Subject: [PATCH 29/72] Delete Interpolation_search.go --- Go/search/Interpolation_search.go | 57 ------------------------------- 1 file changed, 57 deletions(-) delete mode 100644 Go/search/Interpolation_search.go diff --git a/Go/search/Interpolation_search.go b/Go/search/Interpolation_search.go deleted file mode 100644 index 989d3c2283..0000000000 --- a/Go/search/Interpolation_search.go +++ /dev/null @@ -1,57 +0,0 @@ -package main -import "fmt" - -func Search(array []int, num int) int { - - min := array[0] - max := array[len(array)-1] - - low := 0 - high := len(array)-1 - - for { - if num < min { - return low - } - - if num > max { - return high + 1 - } - - var guess int - if high == low { - guess = high - } else { - size := high - low - key := int(float64(size-1) * (float64(num-min) / float64(max-min))) - guess = low + key - } - - if array[guess] == num { - for guess > 0 && array[guess-1] == num { - guess-- - } - return guess - } - - if array[guess] > num { - high = guess - 1 - max = array[high] - } else { - low = guess + 1 - min = array[low] - } - } -} - -// Test Case - -func main(){ - items := []int{1, 12, 24, 34, 43, 57, 60, 72} - fmt.Println(Search(items,34)) -} - -// Output = 3 - -// Time Complexity = O(n) -// Space Complexity = O(n) From 9a8f2c635042aab22a91135a59e7bfcdbeba9ed4 Mon Sep 17 00:00:00 2001 From: Sidhan-Gupta Date: Sun, 20 Dec 2020 14:55:29 +0530 Subject: [PATCH 30/72] vernam cipher implemented --- C-Plus-Plus/cryptography/VernamCipher.cpp | 67 +++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 C-Plus-Plus/cryptography/VernamCipher.cpp diff --git a/C-Plus-Plus/cryptography/VernamCipher.cpp b/C-Plus-Plus/cryptography/VernamCipher.cpp new file mode 100644 index 0000000000..492bce3da3 --- /dev/null +++ b/C-Plus-Plus/cryptography/VernamCipher.cpp @@ -0,0 +1,67 @@ +//Vernam Cipher + +// Vernam Cipher is a symmetric key cryptographic algorithm and is one of the transposition technique that converts plain text into ciphertext. +// In this algorithm the size of the key and plain text must be same. + + +#include +using namespace std; + +string encrypt(string plain,string key){ + string enc=""; + int n=key.length(); + for(int i=0;i=26) y = y-26; + enc+=char(y+65); + } + return enc; +} + +string decrypt(string enc,string key){ + string dec=""; + int n=enc.length(); + for(int i=0;i=key[i]){ + dec+=char(enc[i]-key[i]+65); + } + else{ + dec+=char(enc[i]-key[i]+91); // enc[i]-key[i]+26+65 + } + } + return dec; + +} +int main(){ + string plain,encrypted,decrypted,key; + cout<<"USE UPPERCASE LETTERS"<>key; + transform(key.begin(), key.end(), key.begin(), ::toupper); // convert to uppercase if not. + + cout<<"\nEnter the plain text of same size as that of key: "; + cin>>plain; + transform(plain.begin(), plain.end(), plain.begin(), ::toupper); // convert to uppercase if not. + + int n=key.length(); + if(plain.length() Date: Sun, 20 Dec 2020 15:37:41 +0530 Subject: [PATCH 31/72] Create interpolation_search.go --- Go/search/interpolation_search.go | 45 +++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Go/search/interpolation_search.go diff --git a/Go/search/interpolation_search.go b/Go/search/interpolation_search.go new file mode 100644 index 0000000000..f4a50e3f08 --- /dev/null +++ b/Go/search/interpolation_search.go @@ -0,0 +1,45 @@ +package main +import "fmt" + +func Search(array []int, number int) int { + + low := 0 + high := len(array)-1 + + for { + var key int + var size int + + if high == low { + key = high + + } else { + size = high - low + key = low + (int(float64(size-1)*(float64(number-array[0])/float64(array[len(array)-1]-array[0])))) + } + + if array[key] == number { + return key + } + + if array[key] > number { + high = key - 1 + + } else { + low = key + 1 + } + } +} + +// Input + +func main(){ + items := []int{1, 16, 28, 37, 49, 52, 60, 75, 85, 99, 105} + fmt.Println(Search(items,85)) +} + +// Output = 8 + + +// Time Complexity = O(n) +// Space Complexity = O(n) From 7cfb9b787f80340ea0fd4b1aa605377a84891aee Mon Sep 17 00:00:00 2001 From: itsIapetus <75844962+itsIapetus@users.noreply.github.com> Date: Sun, 20 Dec 2020 15:39:00 +0530 Subject: [PATCH 32/72] Update README.md --- Go/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Go/README.md b/Go/README.md index 1aa70a17f4..71a57626f8 100644 --- a/Go/README.md +++ b/Go/README.md @@ -64,3 +64,4 @@ _add list here_ - [Binary Search](/search/binary_search.go) - [Linear Search](/search/linear_search.go) +- [Interpolation Search](/search/interpolation_search.go) From 852acf81703d5362356f6ee79dd068bb5253b418 Mon Sep 17 00:00:00 2001 From: itsIapetus <75844962+itsIapetus@users.noreply.github.com> Date: Sun, 20 Dec 2020 15:39:38 +0530 Subject: [PATCH 33/72] Update README.md --- Go/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Go/README.md b/Go/README.md index 71a57626f8..63b9ec0d8d 100644 --- a/Go/README.md +++ b/Go/README.md @@ -62,6 +62,6 @@ _add list here_ ## Searching -- [Binary Search](/search/binary_search.go) -- [Linear Search](/search/linear_search.go) -- [Interpolation Search](/search/interpolation_search.go) +- [Binary Search](./search/binary_search.go) +- [Linear Search](./search/linear_search.go) +- [Interpolation Search](./search/interpolation_search.go) From 13ddfd17bb488366baf31c270b377df8077ef245 Mon Sep 17 00:00:00 2001 From: Sidhan-Gupta Date: Sun, 20 Dec 2020 17:07:16 +0530 Subject: [PATCH 34/72] Bellmanm Ford implemented --- C-Plus-Plus/graphs/BellmanFord.cpp | 74 ++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 C-Plus-Plus/graphs/BellmanFord.cpp diff --git a/C-Plus-Plus/graphs/BellmanFord.cpp b/C-Plus-Plus/graphs/BellmanFord.cpp new file mode 100644 index 0000000000..a9ef82c900 --- /dev/null +++ b/C-Plus-Plus/graphs/BellmanFord.cpp @@ -0,0 +1,74 @@ + +// Input: +// First line contains two space separated integers,(N,M) +// N- no of vertices, M- no of edges. +// Then M lines follow, each line has 3 space separated integers ui ,vi ,wi which denotes edge from vertex ui to vi with weight wi. +// Find shortest distance from vertex 1 to all other vertices. + + +// TEST CASE +// 5 5 +// 1 2 5 +// 1 3 2 +// 3 4 1 +// 1 4 6 +// 3 5 5 + +//OUTPUT +// 5 2 3 7 + + +#include +using namespace std; +#define tezz_chal ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); +#define ll long long int + +vectoredges[1000001]; +int dist[1000001]; + +void bellmanFord(int n){ + for(ll i=0;i0){ + ll u=edges[k][1],v=edges[k][2],w=edges[k][0]; + if(dist[v]>dist[u]+w){ + dist[v]=dist[u]+w; + } + k++; + } + } +} + +int main(){ + tezz_chal; + int n,m; + cin>>n>>m; + for(int i=0;i>u>>v>>w; + edges[i].push_back(w); + edges[i].push_back(u-1); + edges[i].push_back(v-1); + } + dist[0]=0; + + bellmanFord(n); + + cout<<"Shortest distance to all vertices from vertex 1 is- "< Date: Sun, 20 Dec 2020 23:01:04 +0530 Subject: [PATCH 35/72] made the specified changes --- C-Plus-Plus/cryptography/VernamCipher.cpp | 28 ++++++++++++----------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/C-Plus-Plus/cryptography/VernamCipher.cpp b/C-Plus-Plus/cryptography/VernamCipher.cpp index 492bce3da3..1cab6a2eec 100644 --- a/C-Plus-Plus/cryptography/VernamCipher.cpp +++ b/C-Plus-Plus/cryptography/VernamCipher.cpp @@ -1,7 +1,7 @@ -//Vernam Cipher +/* Vernam Cipher -// Vernam Cipher is a symmetric key cryptographic algorithm and is one of the transposition technique that converts plain text into ciphertext. -// In this algorithm the size of the key and plain text must be same. +Vernam Cipher is a symmetric key cryptographic algorithm and is one of the transposition technique that converts plain text into ciphertext. +In this algorithm the size of the key and plain text must be same. */ #include @@ -12,7 +12,9 @@ string encrypt(string plain,string key){ int n=key.length(); for(int i=0;i=26) y = y-26; + if(y>=26) { + y = y-26; + } enc+=char(y+65); } return enc; @@ -26,7 +28,7 @@ string decrypt(string enc,string key){ dec+=char(enc[i]-key[i]+65); } else{ - dec+=char(enc[i]-key[i]+91); // enc[i]-key[i]+26+65 + dec+=char(enc[i]-key[i]+91); } } return dec; @@ -37,11 +39,11 @@ int main(){ cout<<"USE UPPERCASE LETTERS"<>key; - transform(key.begin(), key.end(), key.begin(), ::toupper); // convert to uppercase if not. + transform(key.begin(), key.end(), key.begin(), ::toupper); cout<<"\nEnter the plain text of same size as that of key: "; cin>>plain; - transform(plain.begin(), plain.end(), plain.begin(), ::toupper); // convert to uppercase if not. + transform(plain.begin(), plain.end(), plain.begin(), ::toupper); int n=key.length(); if(plain.length() Date: Sun, 20 Dec 2020 23:04:01 +0530 Subject: [PATCH 36/72] added specified changes --- C-Plus-Plus/cryptography/VernamCipher.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/C-Plus-Plus/cryptography/VernamCipher.cpp b/C-Plus-Plus/cryptography/VernamCipher.cpp index 1cab6a2eec..d5b8255d4b 100644 --- a/C-Plus-Plus/cryptography/VernamCipher.cpp +++ b/C-Plus-Plus/cryptography/VernamCipher.cpp @@ -10,7 +10,7 @@ using namespace std; string encrypt(string plain,string key){ string enc=""; int n=key.length(); - for(int i=0;i=26) { y = y-26; From 48408503b2fdf011b29c113e2ebde91548fbc4b6 Mon Sep 17 00:00:00 2001 From: Sidhan-Gupta Date: Sun, 20 Dec 2020 23:11:28 +0530 Subject: [PATCH 37/72] indentation made consistent --- C-Plus-Plus/cryptography/VernamCipher.cpp | 64 +++++++++++------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/C-Plus-Plus/cryptography/VernamCipher.cpp b/C-Plus-Plus/cryptography/VernamCipher.cpp index d5b8255d4b..c83e2aa371 100644 --- a/C-Plus-Plus/cryptography/VernamCipher.cpp +++ b/C-Plus-Plus/cryptography/VernamCipher.cpp @@ -8,54 +8,54 @@ In this algorithm the size of the key and plain text must be same. */ using namespace std; string encrypt(string plain,string key){ - string enc=""; - int n=key.length(); - for(int i=0;i=26) { + string enc=""; + int n=key.length(); + for(int i=0;i=26) { y = y-26; } - enc+=char(y+65); - } - return enc; + enc+=char(y+65); + } + return enc; } string decrypt(string enc,string key){ - string dec=""; - int n=enc.length(); - for(int i=0;i=key[i]){ - dec+=char(enc[i]-key[i]+65); - } - else{ - dec+=char(enc[i]-key[i]+91); - } - } - return dec; - + string dec=""; + int n=enc.length(); + for(int i=0;i=key[i]){ + dec+=char(enc[i]-key[i]+65); + } + else{ + dec+=char(enc[i]-key[i]+91); + } + } + return dec; } + int main(){ - string plain,encrypted,decrypted,key; - cout<<"USE UPPERCASE LETTERS"<>key; + string plain,encrypted,decrypted,key; + cout<<"USE UPPERCASE LETTERS"<>key; transform(key.begin(), key.end(), key.begin(), ::toupper); - - cout<<"\nEnter the plain text of same size as that of key: "; - cin>>plain; + + cout<<"\nEnter the plain text of same size as that of key: "; + cin>>plain; transform(plain.begin(), plain.end(), plain.begin(), ::toupper); - int n=key.length(); + int n=key.length(); if(plain.length() Date: Sun, 20 Dec 2020 23:33:15 +0530 Subject: [PATCH 38/72] bellman ford proper indentation --- C-Plus-Plus/graphs/BellmanFord.cpp | 101 +++++++++++++++-------------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/C-Plus-Plus/graphs/BellmanFord.cpp b/C-Plus-Plus/graphs/BellmanFord.cpp index a9ef82c900..756ddae337 100644 --- a/C-Plus-Plus/graphs/BellmanFord.cpp +++ b/C-Plus-Plus/graphs/BellmanFord.cpp @@ -1,21 +1,21 @@ -// Input: -// First line contains two space separated integers,(N,M) -// N- no of vertices, M- no of edges. -// Then M lines follow, each line has 3 space separated integers ui ,vi ,wi which denotes edge from vertex ui to vi with weight wi. -// Find shortest distance from vertex 1 to all other vertices. +/*Input: +First line contains two space separated integers,(N,M) +N- no of vertices, M- no of edges. +Then M lines follow, each line has 3 space separated integers ui ,vi ,wi which denotes edge from vertex ui to vi with weight wi. +Find shortest distance from vertex 1 to all other vertices. -// TEST CASE -// 5 5 -// 1 2 5 -// 1 3 2 -// 3 4 1 -// 1 4 6 -// 3 5 5 +TEST CASE +5 5 +1 2 5 +1 3 2 +3 4 1 +1 4 6 +3 5 5 -//OUTPUT -// 5 2 3 7 +OUTPUT +5 2 3 7 */ #include @@ -27,48 +27,49 @@ vectoredges[1000001]; int dist[1000001]; void bellmanFord(int n){ - for(ll i=0;i0){ - ll u=edges[k][1],v=edges[k][2],w=edges[k][0]; - if(dist[v]>dist[u]+w){ - dist[v]=dist[u]+w; - } - k++; - } + for(ll i=0;i0){ + ll u=edges[k][1],v=edges[k][2],w=edges[k][0]; + if(dist[v]>dist[u]+w){ + dist[v]=dist[u]+w; + } + k++; } + } } int main(){ - tezz_chal; - int n,m; - cin>>n>>m; - for(int i=0;i>n>>m; + for(int i=0;i>u>>v>>w; - edges[i].push_back(w); - edges[i].push_back(u-1); - edges[i].push_back(v-1); - } - dist[0]=0; + for(int i=0;i>u>>v>>w; + edges[i].push_back(w); + edges[i].push_back(u-1); + edges[i].push_back(v-1); + } + dist[0]=0; - bellmanFord(n); + bellmanFord(n); - cout<<"Shortest distance to all vertices from vertex 1 is- "< Date: Sun, 20 Dec 2020 23:43:38 +0530 Subject: [PATCH 39/72] Update interpolation_search.go --- Go/search/interpolation_search.go | 60 +++++++++++++++++-------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/Go/search/interpolation_search.go b/Go/search/interpolation_search.go index f4a50e3f08..4ca0d123a4 100644 --- a/Go/search/interpolation_search.go +++ b/Go/search/interpolation_search.go @@ -1,34 +1,42 @@ package main + import "fmt" func Search(array []int, number int) int { - low := 0 high := len(array)-1 - - for { - var key int - var size int - if high == low { - key = high - - } else { - size = high - low - key = low + (int(float64(size-1)*(float64(number-array[0])/float64(array[len(array)-1]-array[0])))) - } - - if array[key] == number { - return key - } - - if array[key] > number { - high = key - 1 - - } else { - low = key + 1 - } - } + for { + var key int + var size int + var first int + var last int + var value int + + first = array[low] + last = array[high] + + if high == low { + key = high + } else { + size = high - low + value = int((float64(size-1) * (float64(number-first) / float64(last-first)))) + key = low + value + } + if array[key] == number{ + return key + } + if array[key] > number { + high = key - 1 + } else { + low = key + 1 + } + } +} + +func main(){ + items := []int{1, 16, 28, 37, 49, 52, 60, 75, 85, 99, 105} + fmt.Println(Search(items,85)) } // Input @@ -40,6 +48,4 @@ func main(){ // Output = 8 - -// Time Complexity = O(n) -// Space Complexity = O(n) +// Time Complexity = O(n), Space Complexity = O(n) From ba0f65039f3b722a36ab665956e23956f153a054 Mon Sep 17 00:00:00 2001 From: Sidhan-Gupta Date: Sun, 20 Dec 2020 23:44:10 +0530 Subject: [PATCH 40/72] detect negative cycle and bellman ford done --- C-Plus-Plus/graphs/DetectNegativeCycle.cpp | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 C-Plus-Plus/graphs/DetectNegativeCycle.cpp diff --git a/C-Plus-Plus/graphs/DetectNegativeCycle.cpp b/C-Plus-Plus/graphs/DetectNegativeCycle.cpp new file mode 100644 index 0000000000..214dfc345c --- /dev/null +++ b/C-Plus-Plus/graphs/DetectNegativeCycle.cpp @@ -0,0 +1,83 @@ + +/*Input: +First line contains two space separated integers,(N,M) +N- no of vertices, M- no of edges. +Then M lines follow, each line has 3 space separated integers ui ,vi ,wi which denotes edge from vertex ui to vi with weight wi. +Find shortest distance from vertex 1 to all other vertices. + + +TEST CASE +4 4 +1 2 1 +2 3 -1 +3 4 -1 +4 1 -1 + +OUTPUT +Negative Cycle Present */ + + +#include +using namespace std; +#define tezz_chal ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); +#define ll long long int + +vectoredges[1000001]; +int dist[1000001]; +bool flag=false; + +void relax(){ + int k=0; + while(edges[k].size()>0){ + ll u=edges[k][1],v=edges[k][2],w=edges[k][0]; + if(dist[v]>dist[u]+w){ + dist[v]=dist[u]+w; + flag=true; + } + k++; + } +} + +void bellmanFord(int n){ + for(ll i=0;i>n>>m; + for(int i=0;i>u>>v>>w; + edges[i].push_back(w); + edges[i].push_back(u-1); + edges[i].push_back(v-1); + } + dist[0]=0; + + bellmanFord(n); + flag=false; + relax(); + if(flag==true){ + cout<<"Negative Cycle is present"< Date: Mon, 21 Dec 2020 19:52:40 +0530 Subject: [PATCH 41/72] made the specified changes --- .../other/SortColors-DutchNationalFlag.cpp | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp b/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp index 3e7f2de86e..a927e8c960 100644 --- a/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp +++ b/C-Plus-Plus/other/SortColors-DutchNationalFlag.cpp @@ -1,36 +1,26 @@ -#include -using namespace std; -// -// PROBLEM STATEMENT- https://leetcode.com/problems/sort-colors/ +/* +PROBLEM STATEMENT- https://leetcode.com/problems/sort-colors/ -// Given an array nums with n objects colored red, white, or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white, and blue. -// Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively. -// In simpler words sort an array containing 0,1,2. +Given an array nums with n objects colored red, white, or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white, and blue. +Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively. +In simpler words sort an array containing 0,1,2. -// Solve the problem with a one-pass algorithm using only O(1) constant space? +Solve the problem with a one-pass algorithm using only O(1) constant space? -// TEST CASE- -// Input: -// n=6 -// nums = [2,0,2,1,1,0] -// Output: [0,0,1,1,2,2] +The bruteforce approach - Sort the vector in nlogn time -// Input: -// n=3 -// nums = [2,0,1] -// Output: [0,1,2] + ************************DUTCH_NATIONAL_FLAG ALGORITHM*********************************** + */ -// The bruteforce approach - Sort the vector in nlogn time - -// ************************DUTCH_NATIONAL_FLAG ALGORITHM*********************************** +#include +using namespace std; void sortColors(vector nums) { int n=nums.size(); - int low=0,med=0,high=n-1; // mantain 3 pointers + int low=0,med=0,high=n-1; int temp; - while(med<=high){ // base condition-when med pointer becomes greater than high ,break + while(med<=high){ if(nums[med]==0){ - // swap(nums[med],nums[low]); temp=nums[med]; nums[med]=nums[low]; nums[low]=temp; @@ -41,7 +31,6 @@ void sortColors(vector nums) { med++; } else{ - // swap(nums[med],nums[high]); temp=nums[med]; nums[med]=nums[high]; nums[high]=temp; @@ -64,6 +53,18 @@ void sortColors(vector nums) { sortColors(nums); } - // COMPLEXITY ANALYSIS- - // Time= O(N) - // space=O(1) \ No newline at end of file +/*TEST CASE- +Input: +n=6 +nums = [2,0,2,1,1,0] +Output: [0,0,1,1,2,2] + +Input: +n=3 +nums = [2,0,1] +Output: [0,1,2] + +COMPLEXITY ANALYSIS- + Time= O(N) + space=O(1) +*/ From cd0c9888225096e6bdd3e9a5d41dd96c159e0762 Mon Sep 17 00:00:00 2001 From: Yashwin Date: Mon, 21 Dec 2020 21:11:41 +0530 Subject: [PATCH 42/72] Changes done --- C-Plus-Plus/cp/Josephus.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/C-Plus-Plus/cp/Josephus.cpp b/C-Plus-Plus/cp/Josephus.cpp index f9721a0a65..9decf73d14 100644 --- a/C-Plus-Plus/cp/Josephus.cpp +++ b/C-Plus-Plus/cp/Josephus.cpp @@ -4,6 +4,7 @@ In each iteration we kill the every kth person in a circular arrangement of n persons. Find the person who is alive at the end. 0-based indexing +link to the problem : https://en.wikipedia.org/wiki/Josephus_problem **/ #include @@ -16,9 +17,9 @@ int solution(int n, int k){ } int main() { - int n, k; - cin >> n; - cout << solution(n,k) << '\n'; + int people, gap; + cin >> people >> gap; + cout << solution(people, gap) << '\n'; return 0; } From 25470586bcc1f5b388d62a002055f1c6b25c5c54 Mon Sep 17 00:00:00 2001 From: Yashwin Date: Mon, 21 Dec 2020 21:23:54 +0530 Subject: [PATCH 43/72] Changes done --- Java/cp/NQueens.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Java/cp/NQueens.java b/Java/cp/NQueens.java index ce5a609caa..b0099df99b 100644 --- a/Java/cp/NQueens.java +++ b/Java/cp/NQueens.java @@ -22,12 +22,17 @@ public static void solve(boolean[][] board, boolean[] cols, if(cols[col] == false && ndiag[row+col] == false && rdiag[row-col+board.length-1] == false) { // place the queen + // let the column get occpied + // correspondingly ndiag and rdiag + // matrices are populated cols[col] = true; ndiag[row+col] = true; rdiag[row-col+board.length-1] = true; board[row][col] = true; solve(board, cols, ndiag, rdiag, row+1, asf+row+'-'+col+", "); // backtrack + // remove all the markings + // made in the above step cols[col] = false; ndiag[row+col] = false; rdiag[row-col+board.length-1] = false; @@ -61,4 +66,7 @@ public static void main(String[] args) throws Exception { Space Complexity : O(n^2) Time Complexity : upperbounded by O(n^n) -**/ \ No newline at end of file +**/ + + + From 97b9d3126378e35ba43e4d3b8194f5ade3e2ff49 Mon Sep 17 00:00:00 2001 From: Sidhan-Gupta Date: Tue, 22 Dec 2020 00:32:50 +0530 Subject: [PATCH 44/72] made specified changes --- C-Plus-Plus/graphs/BellmanFord.cpp | 9 +++------ C-Plus-Plus/graphs/DetectNegativeCycle.cpp | 9 +++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/C-Plus-Plus/graphs/BellmanFord.cpp b/C-Plus-Plus/graphs/BellmanFord.cpp index 756ddae337..fe1a26c259 100644 --- a/C-Plus-Plus/graphs/BellmanFord.cpp +++ b/C-Plus-Plus/graphs/BellmanFord.cpp @@ -20,17 +20,15 @@ OUTPUT #include using namespace std; -#define tezz_chal ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); -#define ll long long int vectoredges[1000001]; int dist[1000001]; void bellmanFord(int n){ - for(ll i=0;i0){ - ll u=edges[k][1],v=edges[k][2],w=edges[k][0]; + int u=edges[k][1],v=edges[k][2],w=edges[k][0]; if(dist[v]>dist[u]+w){ dist[v]=dist[u]+w; } @@ -40,7 +38,6 @@ void bellmanFord(int n){ } int main(){ - tezz_chal; int n,m; cin>>n>>m; for(int i=0;i using namespace std; -#define tezz_chal ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); -#define ll long long int vectoredges[1000001]; int dist[1000001]; @@ -29,7 +27,7 @@ bool flag=false; void relax(){ int k=0; while(edges[k].size()>0){ - ll u=edges[k][1],v=edges[k][2],w=edges[k][0]; + int u=edges[k][1],v=edges[k][2],w=edges[k][0]; if(dist[v]>dist[u]+w){ dist[v]=dist[u]+w; flag=true; @@ -39,13 +37,12 @@ void relax(){ } void bellmanFord(int n){ - for(ll i=0;i>n>>m; for(int i=0;i Date: Wed, 23 Dec 2020 10:28:00 +0530 Subject: [PATCH 45/72] Reformat the code and Resolve the changes. --- C-Plus-Plus/cryptography/Caeser_Cipher.cpp | 71 ++++++++---------- .../cryptography/Homophonic_Cipher.cpp | 73 +++++++++--------- .../cryptography/Modified_Caeser_Cipher.cpp | 74 ++++++++----------- 3 files changed, 94 insertions(+), 124 deletions(-) diff --git a/C-Plus-Plus/cryptography/Caeser_Cipher.cpp b/C-Plus-Plus/cryptography/Caeser_Cipher.cpp index ad42ad8064..64592067df 100644 --- a/C-Plus-Plus/cryptography/Caeser_Cipher.cpp +++ b/C-Plus-Plus/cryptography/Caeser_Cipher.cpp @@ -1,58 +1,47 @@ -//Caeser cipher - -/* -It is a type of susbtitution cipher which encrypts the plain text -message into a cipher text by simply replacing each letter -of a given text by a letter 3 places down the alphabet. - - -Example: -Text : TESSERACTCODING -Shift: 3 -Cipher: WHVVHUDFWFRGLQJ - -Text : NEOALGO -Shift: 3 -Cipher: QHRDOJR - -Time Complexity: O(n) -Space Complexity: O(n) - -Optimised method: -Change the plain text itself instead of initializing a new -string varibale if plain text is mutable. -Space complexity: O(1) -Time Complexity: O(n) - -*/ - #include using namespace std; -string encode(string plain){ +/* Encrypts the plain text message into a cipher +text by simply replacing each letter of a given +text by a letter '3' places down the alphabet. */ +string encode(string plain) { - string encrypt=""; + string encrypt = ""; int length = plain.length(); - for(int i=0;i 97) { + //lowercase letter + encrypt += char((plain[i] - 97 + 3)%26 + 97); } - else if(plain[i]>97) - //lowercase letter - encrypt+=char((plain[i]-97+3)%26+97); } - return encrypt; + return encrypt; } -int main(){ +int main() { string plain,encrypt; - cout<<"Enter the plain text: "; + cout<<"Enter the plain text: "; cin>>plain; encrypt = encode(plain); cout<<"Cipher Text: "< using namespace std; -void mapping(vector > &code){ //Mapping one plain-text alphabet to more than one cipher-text alphabet. +//Mapping one plain-text alphabet to more than one cipher-text alphabet. +void mapping(vector > &code) { code[0].push_back('Q');code[0].push_back('4'); code[1].push_back('W'); code[2].push_back('E'); @@ -57,31 +31,32 @@ void mapping(vector > &code){ //Mapping one plain-text alphabet code[25].push_back('M'); } -string encode(string plain){ +/* Encodes characters of plain text by one of the +several different cipher text letters using a map. */ +string encode(string plain) { vector >code(26); mapping(code); - string encrypted = ""; int n = plain.length(); - for(int i=0;i=97){ //if lowercase + for(int i = 0;i < n; ++i) { + //if lowercase character + if(plain[i] >= 97) { + int num = (rand() % (code[plain[i] - 97].size())); - int num = (rand() % (code[plain[i]-97].size())); - - if(code[plain[i]-97][num] >= 65) //if character - encrypted = encrypted+char(code[plain[i]-97][num]-65+97); - else //if numeral - encrypted = encrypted+code[plain[i]-97][num]; + if(code[plain[i]-97][num] >= 65) + encrypted = encrypted+char(code[plain[i]-97][num]- 65 + 97); + else + encrypted = encrypted+code[plain[i]-97][num]; } - else{ //if uppercase + //uppercase letter + else { int num = (rand() % (code[plain[i]-65].size())); encrypted = encrypted+code[plain[i]-65][num]; } } return encrypted; - } int main(){ @@ -97,3 +72,21 @@ int main(){ cout<<"Cipher Text: "< using namespace std; -string encode(string plain, int shift){ +/* Encrypts the plain text message into a cipher text +by simply replacing each letter of a given text by +some places down the alphabet. */ +string encode(string plain, int shift) { - string encrypt=""; + string encrypt = ""; int length = plain.length(); - for(int i=0;i 97) { + //lowercase letter + encrypt += char((plain[i] - 97 + shift)%26 + 97); } - else if(plain[i]>97) - //lowercase letter - encrypt+=char((plain[i]-97+shift)%26+97); } + return encrypt; - } -int main(){ +int main() { string plain,encrypt; - int shift; + int shift; cout<<"Enter the plain text: "; cin>>plain; - cout<<"Enter the integer key to shift: "; + cout<<"Enter the integer key to shift: "; cin>>shift; encrypt = encode(plain,shift); cout<<"Cipher Text: "< Date: Wed, 23 Dec 2020 14:35:51 +0530 Subject: [PATCH 46/72] made specified changes and code made robust --- C-Plus-Plus/graphs/BellmanFord.cpp | 87 ++++++++++++++------- C-Plus-Plus/graphs/DetectNegativeCycle.cpp | 88 +++++++++++++--------- 2 files changed, 115 insertions(+), 60 deletions(-) diff --git a/C-Plus-Plus/graphs/BellmanFord.cpp b/C-Plus-Plus/graphs/BellmanFord.cpp index fe1a26c259..8caf362c06 100644 --- a/C-Plus-Plus/graphs/BellmanFord.cpp +++ b/C-Plus-Plus/graphs/BellmanFord.cpp @@ -15,51 +15,86 @@ TEST CASE 3 5 5 OUTPUT -5 2 3 7 */ +Vertex Distance from Source +0 0 +1 5 +2 2 +3 3 +4 7 */ #include using namespace std; -vectoredges[1000001]; -int dist[1000001]; +struct Edge { + int src, dest, weight; +}; -void bellmanFord(int n){ - for(int i=0;i0){ - int u=edges[k][1],v=edges[k][2],w=edges[k][0]; - if(dist[v]>dist[u]+w){ - dist[v]=dist[u]+w; - } - k++; +struct Graph { + int V, E; + struct Edge* edge; +}; + +struct Graph* createGraph(int V, int E) +{ + struct Graph* graph = new Graph; + graph->V = V; + graph->E = E; + graph->edge = new Edge[E]; + return graph; +} + +void showDist(int dist[], int n) +{ + cout<<"Vertex Distance from Source"<V; + int E = graph->E; + int dist[V]; + for (int i = 0; i < V; i++) + dist[i] = INT_MAX; + dist[src] = 0; + for(int i=0;iedge[j].src; + int v = graph->edge[j].dest; + int w = graph->edge[j].weight; + if (dist[u] != INT_MAX && dist[u] + w < dist[v]) + dist[v] = dist[u] + w; } } + + for (int i = 0; i < E; i++) { + int u = graph->edge[i].src; + int v = graph->edge[i].dest; + int weight = graph->edge[i].weight; + if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) { + cout<<"Graph contains negative weight cycle, hence the shortest distance is not gauranteed"<>n>>m; - for(int i=0;i>u>>v>>w; - edges[i].push_back(w); - edges[i].push_back(u-1); - edges[i].push_back(v-1); + graph->edge[i].src = u-1; + graph->edge[i].dest = v-1; + graph->edge[i].weight = w; } - dist[0]=0; - - bellmanFord(n); - cout<<"Shortest distance to all vertices from vertex 1 is- "< using namespace std; -vectoredges[1000001]; -int dist[1000001]; -bool flag=false; +struct Edge { + int src, dest, weight; +}; -void relax(){ - int k=0; - while(edges[k].size()>0){ - int u=edges[k][1],v=edges[k][2],w=edges[k][0]; - if(dist[v]>dist[u]+w){ - dist[v]=dist[u]+w; - flag=true; +struct Graph { + int V, E; + struct Edge* edge; +}; + +struct Graph* createGraph(int V, int E) +{ + struct Graph* graph = new Graph; + graph->V = V; + graph->E = E; + graph->edge = new Edge[E]; + return graph; +} + +bool containNegativeCycle(struct Graph* graph, int src){ + int V = graph->V; + int E = graph->E; + int dist[V]; + + for (int i = 0; i < V; i++) + dist[i] = INT_MAX; + dist[src] = 0; + + for(int i=0;iedge[j].src; + int v = graph->edge[j].dest; + int w = graph->edge[j].weight; + if (dist[u] != INT_MAX && dist[u] + w < dist[v]) + dist[v] = dist[u] + w; } - k++; } -} -void bellmanFord(int n){ - for(int i=0;iedge[i].src; + int v = graph->edge[i].dest; + int weight = graph->edge[i].weight; + if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) { + return true; + } + } + return false; } int main(){ int n,m; cin>>n>>m; - for(int i=0;i>u>>v>>w; - edges[i].push_back(w); - edges[i].push_back(u-1); - edges[i].push_back(v-1); + graph->edge[i].src = u-1; + graph->edge[i].dest = v-1; + graph->edge[i].weight = w; } - dist[0]=0; - bellmanFord(n); - flag=false; - relax(); - if(flag==true){ - cout<<"Negative Cycle is present"< Date: Wed, 23 Dec 2020 14:37:34 +0530 Subject: [PATCH 47/72] made specified changes and code made robust --- C-Plus-Plus/graphs/BellmanFord.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/C-Plus-Plus/graphs/BellmanFord.cpp b/C-Plus-Plus/graphs/BellmanFord.cpp index 8caf362c06..b131b3558e 100644 --- a/C-Plus-Plus/graphs/BellmanFord.cpp +++ b/C-Plus-Plus/graphs/BellmanFord.cpp @@ -55,9 +55,11 @@ void bellmanFord(struct Graph* graph, int src){ int V = graph->V; int E = graph->E; int dist[V]; + for (int i = 0; i < V; i++) dist[i] = INT_MAX; dist[src] = 0; + for(int i=0;iedge[j].src; @@ -73,8 +75,8 @@ void bellmanFord(struct Graph* graph, int src){ int v = graph->edge[i].dest; int weight = graph->edge[i].weight; if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) { - cout<<"Graph contains negative weight cycle, hence the shortest distance is not gauranteed"< Date: Wed, 23 Dec 2020 15:13:16 +0530 Subject: [PATCH 48/72] formatted code --- C-Plus-Plus/graphs/BellmanFord.cpp | 60 +++++++++++++++--------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/C-Plus-Plus/graphs/BellmanFord.cpp b/C-Plus-Plus/graphs/BellmanFord.cpp index b131b3558e..0fdd8958be 100644 --- a/C-Plus-Plus/graphs/BellmanFord.cpp +++ b/C-Plus-Plus/graphs/BellmanFord.cpp @@ -1,27 +1,7 @@ - -/*Input: -First line contains two space separated integers,(N,M) -N- no of vertices, M- no of edges. -Then M lines follow, each line has 3 space separated integers ui ,vi ,wi which denotes edge from vertex ui to vi with weight wi. -Find shortest distance from vertex 1 to all other vertices. - - -TEST CASE -5 5 -1 2 5 -1 3 2 -3 4 1 -1 4 6 -3 5 5 - -OUTPUT -Vertex Distance from Source -0 0 -1 5 -2 2 -3 3 -4 7 */ - +/* +Bellman Ford algorithm can handle negative weights which dijkstra couldn't. +However it cannot handle negative cycles and have more complexity than Dijkstra. +*/ #include using namespace std; @@ -98,12 +78,32 @@ int main(){ bellmanFord(graph,0); return 0; } + /* -Time- complexity - O(VE) - If there are 'n' vertices, then there can be n(n-1)/2 edges thus the worst case time complexity is O(n^3). -Space Complexity- - O(V) +Input: +First line contains two space separated integers,(N,M) +N- no of vertices, M- no of edges. +Then M lines follow, each line has 3 space separated integers ui ,vi ,wi which denotes edge from vertex ui to vi with weight wi. +Find shortest distance from vertex 1 to all other vertices. + +TEST CASE +5 5 +1 2 5 +1 3 2 +3 4 1 +1 4 6 +3 5 5 + +OUTPUT +Vertex Distance from Source +0 0 +1 5 +2 2 +3 3 +4 7 + +Time- complexity: O(VE) +If there are 'n' vertices, then there can be n(n-1)/2 edges thus the worst case time complexity is O(n^3). -Bellman Ford algorithm can handle negative weights which dijkstra couldn't. However it cannot handle negative cycles and have more complexity than Dijkstra. +Space Complexity: O(V) */ From ee70e535db420653cbfe97ef96324a532b75cd3a Mon Sep 17 00:00:00 2001 From: Sidhan-Gupta Date: Thu, 24 Dec 2020 00:46:30 +0530 Subject: [PATCH 49/72] Updated readme fie in cpp folder --- C-Plus-Plus/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/C-Plus-Plus/README.md b/C-Plus-Plus/README.md index a9665a5678..e7539f348d 100644 --- a/C-Plus-Plus/README.md +++ b/C-Plus-Plus/README.md @@ -86,6 +86,8 @@ - [Cycle Detection in Graph](graphs/detect_cycle.cpp) - [Check for bipartite graph](graphs/Check_for_bipartite_graph.cpp) - [Toplogical Sort in Diredted Acyclic Graph (DAG)](graphs/TopologicalSort.cpp) +- [Detect Negative Cycle in Graph](graphs/DetectNegativeCycle.cpp) +- [Bellman Ford's Algorithm](graphs/BellmanFord.cpp) ## Searching From 9fbed4e1b5a671adcd26ee9e84da14fa46031515 Mon Sep 17 00:00:00 2001 From: Sidhan-Gupta Date: Thu, 24 Dec 2020 00:58:53 +0530 Subject: [PATCH 50/72] README FILE UPDATED --- C-Plus-Plus/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/C-Plus-Plus/README.md b/C-Plus-Plus/README.md index a9665a5678..c444b8fa8b 100644 --- a/C-Plus-Plus/README.md +++ b/C-Plus-Plus/README.md @@ -156,6 +156,7 @@ _add list here_ - [Affine substitution Cipher](cryptography/Affine_substitution_Cipher.cpp) - [Vigenere Cipher](cryptography/Vigenere_Cipher.cpp) +- [Vernam Cipher](cryptography/VernamCipher.cpp) ## Other From 93186d80523d6bbf5ea4bd9b1c0d20753242595c Mon Sep 17 00:00:00 2001 From: Ahana Pal <59911272+ErzaTitania-2001@users.noreply.github.com> Date: Fri, 25 Dec 2020 21:02:38 +0530 Subject: [PATCH 51/72] Shortest Distance Between Words Shortest Distance Between Words #1685 --- Java/cp/GC2.java | 86 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 Java/cp/GC2.java diff --git a/Java/cp/GC2.java b/Java/cp/GC2.java new file mode 100644 index 0000000000..26adc97043 --- /dev/null +++ b/Java/cp/GC2.java @@ -0,0 +1,86 @@ +/* Given a list of words and two words word1 and word2, find the shortest distance between those two words from the list. + */ +import java.util.*; +class GC2 { + static List < String > arr; + public static void main(String args[]) { + int t = 0; + + Scanner sc = new Scanner(System.in); + System.out.println("Enter the list of words " + "\n" + "Words = "); + arr = new ArrayList < > (); + + arr.add(sc.nextLine()); + while (sc.hasNext()) { + arr.add(sc.nextLine()); + if (sc.hasNextInt()) { + t = sc.nextInt(); + break; + } + + } + + List < String > wd = new ArrayList(arr); + while (t > 0) { + String wd1 = sc.next(); + String wd2 = sc.next(); + System.out.println(" The shortest Distance between " + wd1 + " and " + wd2 + " is : " + shortest_dist(wd, wd1, wd2)); + wd = new ArrayList(arr); + + t--; + } + + } + public static int shortest_dist(List < String > wd, String wd1, String wd2) { + int dist = -1; + List < String > wdcopy = new ArrayList(wd); + List < Integer > ind1 = new ArrayList < > (); + List < Integer > ind2 = new ArrayList < > (); + + while (wd.contains(wd1)) { + ind1.add(wd.indexOf(wd1)); + // + wd.add(wd.indexOf(wd1), "0"); + wd.remove(wd.indexOf(wd1)); + + } + + while (wdcopy.contains(wd2)) { + ind2.add(wdcopy.indexOf(wd2)); + + wdcopy.add(wdcopy.indexOf(wd2), "0"); + wdcopy.remove(wdcopy.indexOf(wd2)); + } + + for (int i = 0; i < ind1.size(); i++) { + for (int j = 0; j < ind2.size(); j++) { + int d = (int) Math.abs(ind1.get(i) - ind2.get(j)); + if (dist == -1) + dist = d; + else if ((dist != -1) && (d < dist)) + dist = d; + } + } + return dist; + + } +} +/*Sample Input And Output : + * Enter the list of words +Words = +practice +makes +perfect +coding +makes +2 +practice +coding + The shortest Distance between practice and coding is : 3 +coding +makes + The shortest Distance between coding and makes is : 1 + + Timple Complexity : O(n) + Space Complexity : O(1) + */ \ No newline at end of file From d404d2dc5982efa139ab56aed4ef9e450baa1130 Mon Sep 17 00:00:00 2001 From: Ahana Pal <59911272+ErzaTitania-2001@users.noreply.github.com> Date: Fri, 25 Dec 2020 21:03:32 +0530 Subject: [PATCH 52/72] Update and rename GC2.java to Shortest_Dist.java --- Java/cp/{GC2.java => Shortest_Dist.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename Java/cp/{GC2.java => Shortest_Dist.java} (98%) diff --git a/Java/cp/GC2.java b/Java/cp/Shortest_Dist.java similarity index 98% rename from Java/cp/GC2.java rename to Java/cp/Shortest_Dist.java index 26adc97043..438730772d 100644 --- a/Java/cp/GC2.java +++ b/Java/cp/Shortest_Dist.java @@ -1,7 +1,7 @@ /* Given a list of words and two words word1 and word2, find the shortest distance between those two words from the list. */ import java.util.*; -class GC2 { +class Shortest_Dist { static List < String > arr; public static void main(String args[]) { int t = 0; @@ -83,4 +83,4 @@ else if ((dist != -1) && (d < dist)) Timple Complexity : O(n) Space Complexity : O(1) - */ \ No newline at end of file + */ From 01b12e26040f37b7ec8ed9427f116e23a7661dc8 Mon Sep 17 00:00:00 2001 From: Ahana Pal <59911272+ErzaTitania-2001@users.noreply.github.com> Date: Fri, 25 Dec 2020 21:04:49 +0530 Subject: [PATCH 53/72] Update README.md --- Java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Java/README.md b/Java/README.md index b5dfe8da4f..df033233cd 100644 --- a/Java/README.md +++ b/Java/README.md @@ -47,6 +47,7 @@ _add list here_ - [Ugly Number With Recursion](cp/UglyRecursion.java) - [PDDI Using Recursion](cp/ArmStrongRecursion.java) - [Subarray of an array with given sum in O(n) time](cp/Subarray.java) +- [Shortest Distance Between Words](cp/Shortest_Dist.java) ## Cryptography From 596a6c90edb76fae09b09090cc7b494de6f879da Mon Sep 17 00:00:00 2001 From: Ahana Pal <59911272+ErzaTitania-2001@users.noreply.github.com> Date: Sat, 26 Dec 2020 15:27:10 +0530 Subject: [PATCH 54/72] Removed spaces between < > --- Java/cp/Shortest_Dist.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Java/cp/Shortest_Dist.java b/Java/cp/Shortest_Dist.java index 438730772d..cd6bc9f00d 100644 --- a/Java/cp/Shortest_Dist.java +++ b/Java/cp/Shortest_Dist.java @@ -8,7 +8,7 @@ public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.println("Enter the list of words " + "\n" + "Words = "); - arr = new ArrayList < > (); + arr = new ArrayList <> (); arr.add(sc.nextLine()); while (sc.hasNext()) { @@ -34,8 +34,8 @@ public static void main(String args[]) { public static int shortest_dist(List < String > wd, String wd1, String wd2) { int dist = -1; List < String > wdcopy = new ArrayList(wd); - List < Integer > ind1 = new ArrayList < > (); - List < Integer > ind2 = new ArrayList < > (); + List < Integer > ind1 = new ArrayList <> (); + List < Integer > ind2 = new ArrayList <> (); while (wd.contains(wd1)) { ind1.add(wd.indexOf(wd1)); From d2fc046c187326e91d19b1c30bb52b705c041971 Mon Sep 17 00:00:00 2001 From: gargVader Date: Sat, 26 Dec 2020 18:58:26 +0530 Subject: [PATCH 55/72] Shifted to stack section --- C-Plus-Plus/README.md | 3 ++- C-Plus-Plus/{other => stack}/Stock_span_problem.cpp | 0 2 files changed, 2 insertions(+), 1 deletion(-) rename C-Plus-Plus/{other => stack}/Stock_span_problem.cpp (100%) diff --git a/C-Plus-Plus/README.md b/C-Plus-Plus/README.md index 2ed4b09ce8..d8734df642 100644 --- a/C-Plus-Plus/README.md +++ b/C-Plus-Plus/README.md @@ -118,6 +118,7 @@ ## Stack based problems - [Largest rectangular area under histogram](stack/Largest_rect_area_under_histogram.cpp) +- [Stock Span Problem](stack/Stock_span_problem.cpp) ## Machine Learning @@ -187,4 +188,4 @@ _add list here_ - [Kth largest element](other/Kth_largest_element.cpp.cpp) - [Kth smallest element](other/Kth_smallest_element.cpp) - [Generate all Subsets](other/subsets.cpp) -- [Stock Span Problem](other/Stock_span_problem.cpp) + diff --git a/C-Plus-Plus/other/Stock_span_problem.cpp b/C-Plus-Plus/stack/Stock_span_problem.cpp similarity index 100% rename from C-Plus-Plus/other/Stock_span_problem.cpp rename to C-Plus-Plus/stack/Stock_span_problem.cpp From 242844bcc2488296d0e84bb82d75c7f55e00b38c Mon Sep 17 00:00:00 2001 From: Pranav Date: Sun, 13 Dec 2020 11:04:40 +0530 Subject: [PATCH 56/72] Added RatInMaze.py --- Python/README.md | 1 + Python/backtracking/RatInMaze.py | 50 ++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 Python/backtracking/RatInMaze.py diff --git a/Python/README.md b/Python/README.md index 33cbd3326d..978398cfad 100644 --- a/Python/README.md +++ b/Python/README.md @@ -68,6 +68,7 @@ - [Hamiltonian Cycle](backtracking/Hamiltonian_Cycle.py) - [Sudoku Solver](backtracking/sudokuSolver.py) - [Subset Sum](backtracking/Subset_Sum.py) +- [Rat-In-Maze problem](backracking/RatInMaze.py) ## Dynamic Programming diff --git a/Python/backtracking/RatInMaze.py b/Python/backtracking/RatInMaze.py new file mode 100644 index 0000000000..e23eb88d4f --- /dev/null +++ b/Python/backtracking/RatInMaze.py @@ -0,0 +1,50 @@ +# Problem statement- given a maze of 1s with obstacles (represented by 0). We have to print all the possible paths to the end. +# Logical intuition- We have to explore all the possible paths hence our mouse will move in all four directions untill it reaches the end + + +# Sample input- +# 4 +# 1 1 1 1 +# 1 1 0 1 +# 1 1 1 1 +# 1 1 1 1 + + +def printPathHelper(i,j,maze,n,solution): + if i==n-1 and j==n-1: + print() + solution[i][j]=1 + for i in range(n): + for j in range(n): + print(solution[i][j],end=" ") + print() + solution[i][j]=0 + return + + if i<0 or j<0 or i>=n or j>=n or maze[i][j]==0 or solution[i][j]==1: + return + + solution[i][j]=1 + printPathHelper(i+1,j,maze,n,solution) + printPathHelper(i,j+1,maze,n,solution) + printPathHelper(i-1,j,maze,n,solution) + printPathHelper(i,j-1,maze,n,solution) + solution[i][j]=0 + return + + +def printPath(maze): + n=len(maze) + solution=[[0 for j in range(n)]for i in range(n)] + printPathHelper(0,0,maze,n,solution) + +# main +n=int(input()) +maze=[] +for j in range(n): + arr=[int(i) for i in input().split()] + maze.append(arr) + j+=1 +printPath(maze) + +# Time complexity- O(2^(n^2)) From 4248b440917e2cd1af4ac866b03f09c13cee4c17 Mon Sep 17 00:00:00 2001 From: Pranav Date: Wed, 16 Dec 2020 07:36:48 +0530 Subject: [PATCH 57/72] Updated RatInMaze.py --- Python/backtracking/RatInMaze.py | 88 +++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 23 deletions(-) diff --git a/Python/backtracking/RatInMaze.py b/Python/backtracking/RatInMaze.py index e23eb88d4f..982e7b1d03 100644 --- a/Python/backtracking/RatInMaze.py +++ b/Python/backtracking/RatInMaze.py @@ -1,16 +1,20 @@ -# Problem statement- given a maze of 1s with obstacles (represented by 0). We have to print all the possible paths to the end. -# Logical intuition- We have to explore all the possible paths hence our mouse will move in all four directions untill it reaches the end - - -# Sample input- -# 4 -# 1 1 1 1 -# 1 1 0 1 -# 1 1 1 1 -# 1 1 1 1 - +''' +Problem statement- given a maze of 1s with obstacles (represented by 0). We have to print all the possible paths to the end. +Logical intuition- We have to explore all the possible paths hence our mouse will move in all four directions untill it reaches the end +''' def printPathHelper(i,j,maze,n,solution): + ''' + Summary Line: + This funcion helps us to print the path followed by the rat in the maze. It puts 1s at places that the mouse can go and 0s at places where the mouse doesn't go. + + Args: + i- current position on the maze horizontally + j- current position on the maze vertically + maze- The 2D matrix that was inputted through which the Rat has to pass + n- side of the 2D matrix + solution- solution matrix to be returned + ''' if i==n-1 and j==n-1: print() solution[i][j]=1 @@ -20,10 +24,8 @@ def printPathHelper(i,j,maze,n,solution): print() solution[i][j]=0 return - if i<0 or j<0 or i>=n or j>=n or maze[i][j]==0 or solution[i][j]==1: - return - + return solution[i][j]=1 printPathHelper(i+1,j,maze,n,solution) printPathHelper(i,j+1,maze,n,solution) @@ -34,17 +36,57 @@ def printPathHelper(i,j,maze,n,solution): def printPath(maze): + ''' + Summary Line: + This function helps us to take form a solution matrix and calls another method printPathHelper() on the solution matrix to print all possible paths for the mouse. + + Args: + maze- The 2D matrix that was inputted through which the Rat has to pass + ''' n=len(maze) solution=[[0 for j in range(n)]for i in range(n)] printPathHelper(0,0,maze,n,solution) -# main -n=int(input()) -maze=[] -for j in range(n): - arr=[int(i) for i in input().split()] - maze.append(arr) - j+=1 -printPath(maze) +if __name__ == '__main__': + n=int(input()) + maze=[] + for j in range(n): + arr=[int(i) for i in input().split()] + maze.append(arr) + j+=1 + printPath(maze) + +''' +Sample input- +4 +1 1 1 1 +1 1 0 1 +1 0 1 1 +1 1 1 1 + +Illustration for the maze- +(Obstacles at positions where there is 0 in the input matrix) + 0 1 2 3 + +-------+-------+-------+-------+ + | | | | | + 0 | | | | | + | | | | | + +---------------+-------+-------+ + | | | | | + 1 | | | x | | + | | | | | + +-------+-------+-------+-------+ + | | | | | + 2 | | x | | | + | | | | | + +-------+-------+-------+-------+ + | | | | | + 3 | | | | | + | | | | | + +-------+-------+-------+-------+ + +Sample Output- +All possible paths will be printed -# Time complexity- O(2^(n^2)) +Time complexity- O(2^(n^2)) +''' From c027775de649d86d6a7f523f82d89e84a2337355 Mon Sep 17 00:00:00 2001 From: Pranav Date: Sat, 26 Dec 2020 21:00:25 +0530 Subject: [PATCH 58/72] Formatted RatInMaze acc. to Pep8 --- Python/backtracking/RatInMaze.py | 56 ++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/Python/backtracking/RatInMaze.py b/Python/backtracking/RatInMaze.py index 982e7b1d03..fec5a68ed4 100644 --- a/Python/backtracking/RatInMaze.py +++ b/Python/backtracking/RatInMaze.py @@ -1,12 +1,17 @@ ''' -Problem statement- given a maze of 1s with obstacles (represented by 0). We have to print all the possible paths to the end. -Logical intuition- We have to explore all the possible paths hence our mouse will move in all four directions untill it reaches the end +Problem statement- given a maze of 1s with obstacles (represented by 0). +We have to print all the possible paths to the end. +Logical intuition- We have to explore all the possible paths hence our mouse +will move in all four directions untill it reaches the end ''' -def printPathHelper(i,j,maze,n,solution): + +def printPathHelper(i, j, maze, n, solution): ''' Summary Line: - This funcion helps us to print the path followed by the rat in the maze. It puts 1s at places that the mouse can go and 0s at places where the mouse doesn't go. + This funcion helps us to print the path followed by the rat in the maze. + It puts 1s at places that the mouse can go and 0s + at places where the mouse doesn't go. Args: i- current position on the maze horizontally @@ -15,45 +20,48 @@ def printPathHelper(i,j,maze,n,solution): n- side of the 2D matrix solution- solution matrix to be returned ''' - if i==n-1 and j==n-1: + if i == n-1 and j == n-1: print() - solution[i][j]=1 + solution[i][j] = 1 for i in range(n): for j in range(n): - print(solution[i][j],end=" ") + print(solution[i][j], end=" ") print() - solution[i][j]=0 + solution[i][j] = 0 return - if i<0 or j<0 or i>=n or j>=n or maze[i][j]==0 or solution[i][j]==1: + if i < 0 or j < 0 or i >= n or j >= n or\ + maze[i][j] == 0 or solution[i][j] == 1: return - solution[i][j]=1 - printPathHelper(i+1,j,maze,n,solution) - printPathHelper(i,j+1,maze,n,solution) - printPathHelper(i-1,j,maze,n,solution) - printPathHelper(i,j-1,maze,n,solution) - solution[i][j]=0 + solution[i][j] = 1 + printPathHelper(i+1, j, maze, n, solution) + printPathHelper(i, j+1, maze, n, solution) + printPathHelper(i-1, j, maze, n, solution) + printPathHelper(i, j-1, maze, n, solution) + solution[i][j] = 0 return def printPath(maze): ''' Summary Line: - This function helps us to take form a solution matrix and calls another method printPathHelper() on the solution matrix to print all possible paths for the mouse. + This function helps us to take form a solution matrix and calls + another method printPathHelper() on the solution matrix + to print all possible paths for the mouse. Args: maze- The 2D matrix that was inputted through which the Rat has to pass ''' - n=len(maze) - solution=[[0 for j in range(n)]for i in range(n)] - printPathHelper(0,0,maze,n,solution) + n = len(maze) + solution = [[0 for j in range(n)]for i in range(n)] + printPathHelper(0, 0, maze, n, solution) if __name__ == '__main__': - n=int(input()) - maze=[] + n = int(input()) + maze = [] for j in range(n): - arr=[int(i) for i in input().split()] + arr = [int(i) for i in input().split()] maze.append(arr) - j+=1 + j += 1 printPath(maze) ''' @@ -61,7 +69,7 @@ def printPath(maze): 4 1 1 1 1 1 1 0 1 -1 0 1 1 +1 0 1 1 1 1 1 1 Illustration for the maze- From 6c7495a17d4b738a160d70ea554c364485303d9e Mon Sep 17 00:00:00 2001 From: DeepSource Bot Date: Sun, 27 Dec 2020 03:14:46 +0000 Subject: [PATCH 59/72] Add .deepsource.toml --- .deepsource.toml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .deepsource.toml diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 0000000000..496cb94167 --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,22 @@ +version = 1 + +[[analyzers]] +name = "python" +enabled = true + + [analyzers.meta] + runtime_version = "3.x.x" + +[[analyzers]] +name = "go" +enabled = true + + [analyzers.meta] + import_paths = ["github.com/TesseractCoding/NeoAlgo"] + +[[analyzers]] +name = "javascript" +enabled = true + + [analyzers.meta] + environment = ["nodejs"] From 80dc17a284f96fec0fe333bce31bb2297255c852 Mon Sep 17 00:00:00 2001 From: ImgBotApp Date: Sun, 27 Dec 2020 03:50:50 +0000 Subject: [PATCH 60/72] [ImgBot] Optimize images *Total -- 71.81kb -> 49.56kb (30.98%) /LOGO/logo2.png -- 26.97kb -> 9.86kb (63.46%) /LOGO/Logo1.png -- 31.10kb -> 26.22kb (15.68%) /LOGO/Logo3.jpeg -- 13.74kb -> 13.49kb (1.85%) Signed-off-by: ImgBotApp --- LOGO/Logo1.png | Bin 31842 -> 26849 bytes LOGO/Logo3.jpeg | Bin 14070 -> 13810 bytes LOGO/logo2.png | Bin 27620 -> 10092 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/LOGO/Logo1.png b/LOGO/Logo1.png index 2f20c0f4f947ac8d08bc384e622c40599f5cbe4f..9e66d24317f5e7bd3f0890c0cc34ee4d9e3f93e5 100644 GIT binary patch literal 26849 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

SXAn&XQ-seIo$GQ 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 diff --git a/LOGO/logo2.png b/LOGO/logo2.png index efcc2983b1101f49f4db3c1218943b2191f65121..581f27c0ef73d83564a2c69ffdb31880947ef92b 100644 GIT binary patch literal 10092 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 literal 27620 zcmeFZXHZq!)-Afs2}BeSkf0b)$s#$aAgCZHAgBnaL`h1{U_>N}NRlKVA|fC;2Sq?~ z63HM*a?bg+>37cickiouRqxNMTXpu?8(gkA=NNtT-dgLe&sW#vWyp8a?&h{Zkdxvdw&rBZ1Q8N>ltYozN_3#ucBuiV(QhsBL*=;pa| z7bvCJEw)lK`4~JWO>H9E9{J?;YYl-TWnl{x&Mg5|zgtFitymWZvd7)Oitu)&1a}Ap zwY1Q2kv6liuuSWB8XP<)B_-8g>LM>C^CU+t%ZhKJL4UxLYsV*km#YTU@FXvKkFM`=DNGj-JlN^s+M7<9oEMIz2yL zy$J}=OAiVtuc--W(sWjzyNy4#BmOwh?BlHz-TlI%g&c5l zk?-s7bXqa~QBo4ARqEyT*RUypu{u=bWe~4k_NOx}pD$@FW~3bOdHDdp|DCAm&2QZL z*8bK&O?c`1^UoeF&pu#PmXSUDNpW=XC~dGA-4A%fpM``TYEOsrafO7ni~bg)k$lpv3&;&wYJ;CpC1n zwLd(6{`}K=2tLpE`CuWpT+r-Dlfs)fZ>R)1x9r$^2@Bt-^YX=uvL{=1P;rR}3Ei?= z7>{2zFXHwn{-i-F;@$|bn;R~}#!(5h&CXibcE31C<;mx;_~^2%tdi*O-|=eE@}a_? zB~;0Z0;T3Q)4F^sAmxkH{mZ%~2vgC_WjF-dOT$5X=oUE*GgyhT5>mfX3T2zgD z?gn0Al(Bxodg6qz@j;u3&b;Hex+(d}{FrZT?X|{mNtb(vA3fVl`>|fPJ=1hAiXIF)dmjZL=1gDz^>yo}ppc^kJ}w5;!mt9{K$T5iF5ckYB(jQp;O zPO}{OeYK~zm%7Pnu=Yssjy@i;-g@HUlt0Ub3g5604()Lfdf1t}JC5h@;d3;ccRpp7 ztgbq^YX)i2mh@lGBe}#+KOSv2CD{jG&@-e>nTd^7**kpxl4x zP+TS@lZchvyR#1>?bZZJ>l#YKM6Bi0#K_2$$|8v`%-Xtj>(8EIcWQxxFJIVSxw>A< zb21F#zW226@88o-M&<+6HxTi4Hbgv}rIzvD-<4(bdnFc|uc?wj z%yIOfro%VclrtXY#FO;;(4EzP{o%uhlO}g%{n>pUKPEMfSYNzw;evM6J3hDY0~+uA z?uG3Cci}7g`kzMIG89Z3gssOzEJmBJ&n>gDcrno~HmYh)5m){9yrL&4DJl1=%SE3F zyL+72J@%XL7qiNL{(OBz(&dweM3K#1Vp-b7ySuy1u=~YTuVT)vE%XU{g^2qH=<3iG z6Z>mAA{TV#;`Gc6HD6Rn2m_sjQ|@qDj#8)Nf_m{)F%c295--L$yD_rfBmX{Kk!sLb z9^oF#Ao%Fq_wV1afQ${FZ?L_TXCCp2`L07N;4!?7+oMhAZ)K2Mu)Kl6XEH`%<+)a| zBL`UJ-{$6uUaUz(aKtLbeAW;t$~66VgD1S4I&*AibeTfqxxK=~`GtjVx28UbvRfnT zbs;W#U2M~)P05eCFBDhx4>!h5FZO!JX%w*PElzgt4Hch%Mj?I;L13CfY{e&fnF8Lm z|D2ZLIm07!!;QY`Iaa6E8IcQB-c8K&dNBU`(&I;t9Kq@x7Z=yawjB9rw{}~uz-jH+ zsZ*DyCY~R(zel^X{XN2eQqZn*>Y_W%gZb3>@i(tu@4JOy=;ho2g+NefW>TA&pzmezU68ndEj?A<7?%gA9Pgpp+K0Liqy*^fn^_9E3(yB;1 zLi|^ps>0kd-N&c@Vk8sEfAwff3U%VIhWdK#=CAkg1#cyALy8Vb2Pu8%cy&J^Fa&vs zPwtITijgO>gw4f#%Mld~xr;-_D|dgZ1mi=^>)(_4?2 zf1fkbu<71*SwTTHcXJr8o)>O*Jm~%V!?)55{Cb*{iNnMsdJ|tzB2And59}7_j=c=m za_hyg?5PhLq=_$A$S~|IxM%)WDdpBzB60Z~l|f#JS|e)H)Nz}OQo1!^@pfZ!(ZrVc zodnQ$lbI=4%vO$&y_{z^hr}K$`k?;9D+W}NDMLPfeidP>(NA`3a?wN{@;iL~{P}5| zt5X_68U;@3+sSC(xjx8QK~~qknS~|B~w2nVDk1IpW$c3 z>+=^cge*+9YREkPcP69ih#J6e(*DWj_)l|v-tl+cMK47x=D!1iXbgGBx?<6yzKL$E z&X}z&TNbnBQ?sc|o>uixE3F&ZbL{x>GK5MTLh>Wx&%>o>(DGAnZ?7$*K}l47qNc>l z1k%qfqI3tP5ip+Gvx9YSf`Vdgwq@M?wt3giohW-Q*Wdj&`!qR7OS|MQ_PBp;s?q1f z&f3^~FDmM!wV z`C_(Y074=a3-SVkO_#BTpLF6vZ7u)t>Hy-mP6~lGRY>IgZYAw>gT^aF^xZI>?Yo>? zyYJt*>%C_?k+(pV_yr}TKdnha38^^tlc1TM)_+fPZxR-_M6y0fOGXIwtcRM4i?>Yq zcdB7ib;JUhH`hG|Vy{fXP!eyY>ihKgDOy>jd(iO`(JVcdJ5w#<)+NER;j~3+td-82 z$TcP*CLP(A9UO9dsO$0_SB|l>%MtgbUjOA5FY=Azs)iemvJgG3J+ah>P8>TXr4oNT z+NR(4-MiD0E@aoSnx;*F9hax4r>P1uR1)r#rJOvIj%4Z)9Bn<(`6eXfi_MFfxh73n z#2f)1+Qq!Wa-K8^-8CXks=#IZTD!uZ!%g)}Sy@?qj`hRF5j|Rkici<0jscfV*_$A! zS9^na4r0064!*lRtgWZVrtyTxcmF{xss9Sm->P8h z0@jq26rIuLB>as}Ot^v5f>+<2^#SBMrSSk&@Jgu{Baxg^!#eZqW$)jQ>{&Re(4#zr z#gf~mi_#m}FhrGjQhaq%k~qxeZ;^vu<_mvr7}5sLA-GU#O^qc1(wB(C0{+~YxD2g0*qf2X+oP9VlJ4})3USpC?9G;{C!R@@nFiCw4j zhGX%>LrR}$*#LxbZ??@^7sUr2UcGANvupho0ZEQ4R@%C{*`HWg%swv9jr0cTg`Hnp zo};dcvFJD#_KZB#)%DVr+(ypFuCA`--v9Gsb1i`8*~kCO9|~2+HeXV=Za3X=K~hpZ zeYIeHdC%0;l*`7#VBMCC4y!}Eckd>v8?unz5U{p4HBG88n4O!ucXH^J$?rN^k_@}@B1whRqPiiWvt$7;W*rkZ~?+b@lsizqBG73{2KYsjYWu=s^ z?uq2&WHO0?{(irOQ;$A>z7ZD*C<JZnwq@a)?IEIqu zwu9NBR(naOG(jUzI5#)9lJls91oI9GrXPs2B)uA@JNXVR+V9+K_9ouRda7oURXl2j zgGx@m{#W|pSbBZ9lA_}4;9$d~5(FGh=PqP#>8h628gX%Pnt+Axd$m_UqPEX~i%|fSrqGVH02B21}_Lu*;yPjV>S9ElAE+d&%iNEaZ>`c}w z-5cW-5EOLElb-L4NM~P}Z>aF^DyQ`&ymxB1x2c^@-w!LM-SRFlgf+}oW}IDwUq}6IRN)l-H<_FX{^4yoIPG~2xWy@I4qhc zG&VA$c2l6($yz_}lq-IxPh@0efAi0yN{T6H`nfh`Xy_Lb^N>&3LQ)_jZFJaWe3)al zyta02bydzJWgtyLr<|&9U?7-5T|&S1@UKtTi-vP`4rTxQyGaqMX5*QSh@3rKTwIHb zi?lss#!h-~vUIg4I49q{+5aIX=IHU`#jj~NZodZvp&2+e!MRXbDHk<`)H(I@sQ1m# zQXdzM&VgE{V1DE8vqKG(^z?2nsJGOiVaY zb3CROx}4b(hQjQ}zrEOVP|jpwexBdp8sc0x2Q zvqm$t^oRNSKHI@$Q`k3;dXC%hGKmNdrdZ5~Xj8P>)8X4`*cW7Tjp3GdjT_yfwQN;r zbIKmkQ>V&C$Fj1r1Rwn&k%$a%Nmf?U!9lb-Ow64_E&Wga$~f->?S486Qu@QLy(AZ< zcmRPvP%RcGoHyJ#)wBOV#^Mi1+%8MrQGaXFD5R!ZKN6(7J*H^5G(5Z|)|Bp&q=r*w3b?sGb2VNw(2U)W|d9KZ;wm9&3F;Yyc|XC3$&iGqdFGf#i(nj~^qUMBM4c zVIb$qn|;&LADmOwnYYFN?SfG1OWusyIOW*;Gqx5n>f_ZPf7^Sez90`}PqvQxre1wk zr95oATAIO)vj)F*A{8bJ#cL$W+`dgOzW8SgkxwJ092^|36*xKmO4RK7n_5^9Ua&q{ zL_sU~=)HPF+_#_|#Vs>_e0=G(>W*Gd6#r*Ep7s1>QRpBa992rPv$u}|xWiG(Zi(tr zHyv)G=QH>NK3}SC-O)d*BjV0$ot2Xvk+VXR9h2YmGw;zJ+?w8TrJFYgr+M$5(wQi~ z9=n~K{w}EHP2A=Sj~%3kxl=BZP2!0=tK0ic6eJ&Z<%<#WMv-bkeM18{`n?$sSN&^x_!kx2B##Y0(v2jK3ZwojLbgja;G$n-)=HU&Yw$9~|tCjfg-!lGbV$ z)h%)%XKd|BSvZ#+EYvGxaa<<7wxXybqqfm5(I=gF6a!;E(9`C=)jv*7PN>h!duRD>b7`+?#*5loT<3h*FQfBA&VKWZK=YHYg-VHGdy~w({6G(&7&$g3$ z&^tkT;ISIL`LZOXT_w%NxFKW%TWh`kbXa1_BUc7km($%Y$!-4`P?S%k< zkA~`x7a2p^waAQUi)7G#XPy$4ckZ5x!4-I+pKUZU-r#F~ehYEE&x5j7tAzE7fq@bMp zqV}0;lHRXgeXEh!@c8uUWQeG3eV>zkdMy~61{Dp>yLJuSNC2OOY)<<`X7Ap(0Hdmk z3MC6hdwvVE?fe$Wm*S5;1b*|tDr)QK91#&|8|;Ee7_2F9T0zoU`(S4L6tE^GFzvjY zUP5dCzZ%M`TUofVz92C>)^-qND@hm`q7-qTu_Vz`zwOX z6)(S0Ei!S_XfR#e?&r^+Uu`t6U#Fb4%WG_ki&7iJ0~Kp|i@AUq;*=cWB3 zJUO9~ou^4@QMy2H%cK$Vf_?hApGOw&x0Z&x6-7QSyEoY)7san!*uJ0Y3A#N$ms9PC$&pgb!)3$VUES)|(jl+UOBcaLFuP-T3 z8fKWWWuB4wdiepA=5=DJ6a=r8w*QV!t1%0WFnSh0hOP^It< zQFYf>CIqtba@7XC9K6PdA8u|ocaS=zVDk@dvbu}ji~DwmR~;g2MM;jsQgT_#?>jz01 zat4slz@8mOf) zCubxPq4#VD#k+Q=sh*2pZYFJZT%P^r$EGSbo?&?{B%Z@UEvJ1`1IJ(RwH8OJY{iM( z8L!C1?RMYoJ=>YR%~;)Y^YV_cfE$&j88*Fs`&N58G0QK54?7H)Vr~#ha2xUytgJgK z0=P<{c3e|bye~){r;#YIRFKtHxwe4}O+d%uD1WqFJYO<9-JCMxSd-x8J#bXoqcGfg zJ+|E32KRO++hW(LQ>QYW*0Q_1>cgw}`V|2*QM zf^>Nfakzi~{x8)JP4?t{_^`FOxcKDh(-**r%1p+*#g})sWjrj!HC=&pZmElte3h1O zFE1fYHs{%ARP}dMQcv)GcE}~Y-5@*g;WCu;pEWfZwp)3w+b*rFL;)IgH{HH;X{XeW z+Co20*29NM8X6ij!D(@TmIPcO+Rv+G|G4-66WM;u>VL$$G2@}84Uhr8_%&E<)JCv- z^n=}d_FR=8u}cB+J9_pk6|OJ|6uoLcQ*&j*6G?ArW}wQeG4+8Gu+CusUVtV}i5UA^ zC{LhYGUv{bR@c_LCnmfLHrCq)zZiKQ5=gg=c=Prx6>{AvCJ}D#eT{LdFT=x`IW_Z* z&Rk71XuJkQ5j9fLcBN&ct}BE83#^2GgKqsVkS>n5e0Bfz0(c_0=sW!V{B-mu1!87Ljdhf+ zUAt?|h}$ZGE=uOv*45QDI&=xmC}U+qs5Vt`Rb$ObTZnFQ%Zfkyt*0p0N4U9bYYVq* z+2UE9!*u8nlId;QD(g~4>pw`qpKhmp?(nW-(sY>GhOUlUx3egvkUO_Wj1B~$p3}^Z zvp&dnbe;>v2Q@Q|a-Tonn$_>G=23EpS6418AlTRUXaJ}B8#Ho$f`0Tt9LrdANY}6X zo}dF!v{^s@!-r$RGlO$>S-oB&m0tGfb_dUdi#xXJGihpS3fWG7P@fa-nd~mwzi;3B zWy6qr421ma5qVa>_8f9zg~}ic3joy_dfp>PzD4)WjkPuD=c2FNa=ce`q1{|Jya6I! z3!gKV(etmYynMQ0KKUX3Kt=@lT4I&0H zGjJGs#2sO24UMq6jf>y>QW&n!J9N+Aajc+>Q%#fx+PG?xVV#@Y)R%6ZKM?NBgjKiF zZ%@|BUbfyu3JMD1WPbLu1$nMl`A6}Yat)`(MlF9NwzaMs&R@6g*r7G@J03wLkloQ) za%bM$)_!1SZmxJFvB1PE=O}qcV}U!$rf=5{AJ)5)tlmnLGE+23kmT6oQniaNY0BT7l#us}*ol7ENd_P32g2zDYWQ4ihz zf@x#}x@%}Kp(7B{FjV{D@`1R9lnCFL`?y7|n%#L{zwX0h@n&^EI{>OmUABzD;Ul{1 zOeyHRW;!gLLD{&5UiYtfwS#E15hd>`z5Xrg4$vS=jZT-nBuJHK{#J(?E^1`Q(c9g> z&oZ9BVgiAgg^R0ZGRq#41TOt$eN&N(e3)BKds%OD%7qMzjzP?h3gU^RqT-t>TgH}tamQr~(WxH?7STi_z+Z4fmt6cmoP@BsRk!LjYIcwk z+Sd^Qfu_O3*`TM#PMo+M8bBT@N_|M!mcd?SP#`?;!BzC}^;6aOhPd(qyt-fi;c|07FP3X{~= z<{A1;#zrmwRtsD6@>@(R8x8iE-sz~Vim$C`kQ#k(+sh~-z|q5beTkJgu#i6qz%iU# z-Fm^gPk$9Opc`i|)&35y&aq~?t?+Lr8Syp9m7?;t8MXP#!)(ZAH*+_T(Rs4sA*qZ7 zm9}c7S~^*#S!D&-!EKO){#1aYi^h!M^yj9efOS&9G=ryvaqHO}CyDCLe)$hKh$kOiV@gg;^XwR$__&^HGOJ-_oRvh?S+K8~Tz9ed^<0qsvw$*8S>pbapKg z2~ftmdwaLwa9p~4`BmKpTMyZDse~U<2$qu%2CMJaB;2#cGt~52l{Edn<2W6xsAHWa zGM$5ck{}3PP|z#1wu)}`qF`KCR(=je$aN9rvn+vD>|ajlUU;EAd^iL^8=VluR6q zYHwU;%FdesQ2GNE6^uHs*KAMdPf_f=piXf3@vz(qbvE)mixJ^7XZC{@rU>PU{r3~~ zU);pY)km;jGcxDy-8%v`!pPjtynNhj$J-5YLY`cOmW0k`%F>Qai22h_6rrMTG!ipf zuCeo_gPHCCJ`lw+Rh>YIgqm`qx21xq&B z3ZnPUgmF+irt#?kstx}*BT(ZD$p^X#EzwV`TDsDaX<9UDt{K+l3_V+NhB8ZJ+>F&* zIc!gAs!>b*u*3TL`d-h0y=sFnzg$FGGOkvu3y%o6oox}@qCPlZt@&BBfI^KtR1HhJ z7<1D0n7z1U{Gdx`y0IGCuDj^y=v-3XP*YQ9&Dsw_x3~ahm;3>g0MO$5=ACZKOm;1{ zib@b5<_tWTB|87+{{73PQ!^2zS>WXA>B+Y$e&)=X*P)@F5Z-Txg5&+mAjgnFD8y#> zfs?#`_wFCvg|_nkJ&EIX>Q~|LD00W?zOoZJ(`c4gaVE0kROg`d&$o`vUo+gpNP=VI zF{nuET-`Za`sMF0_87}+?Ikt|JAY~ZOKlfa3g0#~)~?6j=8KyNGA#7ca7ja!u(~>M zNs_C^uln?~{h-eAW5@2Ig3*dQWL7Ozq*QcVC*o_7PT2OCjOt+eJ0TKWG=j#W_CjXY zLZZyf%tGoz7&|WPcnogeGAHvUn!`d*eV~)!KMBj{PRrdY$L(XoE*f|47|lAX^3CGN zkkN7%Mu=_pGHO&a7$kgR;A2MBnqfGtX1|YHzdB8i8$YI+P+PF{H+VPWL#*#!N3M2C zwD!M)fm}67{HZ=3O^{i0CqAnz=lK>rPBnfXHl!pOVNh*Z|6s!CRyW$3w#U}iR-Rcw zY7*QjuzlRkWql|noPbig6LEv;H?$1*B7;XC7y;HIdy6mNMKS!fUGhl zltSANG2u@1-lEexQGDEUCi2^cQ&~1sKG8^giP&GBneMMJMU&Q7#{tZKajKL#34PYt ziLS2kDI?DuG>t-p%uBTC1ehmPkTK8`4)jc0F{wsZfk&%^%$?63tWZGUplYH+lHla2}8j2~$$~Z2$Uy ze)#|U8u*?_HEvTG+s|%L`+gH7%or=Wy+bW2F|Efl?{s8a)e38VquLO`j}X&UT=vK;7s=4HVYlrT4)U4OwlEGTI}B8-e5UY zzYU_$H<+Yc(E%h#S>~he&GO;mo@m$hLIbB6;Bb_i8K{v_R;D7ohx2N2Fv`0&MuFLV zW>X<7P1iC^)CuncO$-`uC7=^^Acv{?b(?`Di_lg!?f$+E&KE``Pe!Sb8UOKLu?N6U zTwy}GrT#Ix>s3_4Ev0$O6DZDpq1hO4W`A%W`AHHekT z_6sJGRmd)WQ8M1;uxK2UkkFKpLM6~yUtOXpJ>@7z(7wx6_~Z0t2I-3zFGHCsUXk%) zIE58uVNtw!^CaQcEP6>%0bWVQ2VdsIG`3u@-#Xi*1DSvbh{hrIHF<{6>aeDu;{b|p ziMCdr=);E(vn+<*pxq{m9#NG%Tq;KcxHS3QG!hSn%IjIQL26?6Y5-lR8<{hM5+0DZ zgKoRYHB!`*w+Z@^7cP)xphjPXcaa@ZsjsVRE;_8zGl7Oqq+_rtGC541hxf?`{f(s> z=XI^jn%j~GDVJ7fYB+xD$49`ubQ_A+X%-f=)#C`0$ewesrMV5hJ|2;No)r zTJaGBfB#;AV9x$qFFpc`**v+U_`_vi!sI!)jxNAY)YRkf2BSN71p3XXrim1ANZ1>s zq_jaKRAO#KMRb`}aO|h0Jqbak9$xR0>hz_Q!B0aX;}%^4*8Eel3Z7TUI<$U5VxmE#;;o0hWF>Ul)>5r zO9HJ)N@Hz2M~$LnBKiW*Z7xIJ*C~H{3K`pY$`q}S3cYa06D%ymvZ0UJ>>wA-=kB^X z-}bO)WW>;_#h-o|NAzM}SNuam=Y6Et=qJdcrvoLo9KdmSa>5*6=EBhlmbPopo)p1& zdh(9;5wgdG@9h5l`%qn+H`e(BGSJ6_h1nP0jdFA!M-wD3OC~}aK%oAF((vKy*J~d_i@pEvC@Lp>%AsY$__)x{YY67He6>o;yC=^9>TBwJc5+5!IVl%!Q zXLPtgwcWDkAm?*bTR}qqg)KSBY0XY_b+U+-`|jh8UfgsK(f)+=H5$gs&Q1oy!FhD= z?B+*bxgX@Z9V#v?Ob_<;()BJpT9flC>og0~)87Mmv>yGfq{B(s3u%v*&){uO|0kls zFxZ(Vf-^P=sK9de?600wP#K%msZ!#q4geeab&=bM(2HsMg@y_t_#?* zh$90FRBs_j741$dWBkEBLV()OP|i*A=2UV%Iz!JVQV(L|cfyciJs#Uwjo?|{@yBZ61%UZHT5_6VI-tit18|H^~V-hRNxB3yxJKYeRzQk_cv_1fRx1=|yezEU9EfyF}@ z>i9D@=84005AY8P9I?uw8a4QT)3H`QV$^^TH$cpJw14i4@s|AIBF{;UE&?(_BpOFI zft`Dna1PvY7FW?@v$|TKTSafwmQD^G=6eNKfsy$#+RNW+YAD!LzFf1gu(@(&H`4jD z^|h6@jzKiCiN$l>$#2yB7?zFT87#*RtXdHQb1Z>;(K@jRX3T60 z9HuWDwIpx5b?X-CF}{z!rKN?ISJxv_Cw2_JFEq(`R<76Z)`&g>roV^!<5 zK%G+h*qkPsb|X=PktC<#P1wK23pSkCHS-ySL#qe#!2`4i3{T`7sAFcH5*CBk2p7(v z_fb-&-P~!Sqk#NQgDN6rU|^6{a^!R|hlN=dOwJLg)i80;1Ec7e?Q6jraO+mm!mqT2 z^wqG5^X$V;1^_onnB$6i^QTG<2|BNfev}V2NQ#Bvqe*&*vFr63xLACrY$K zFzFNt&yh;a?n`|;8w*5AZJdl8C1@Xi(a5_kC52w$Htw}*D`cd8RAvICAo$MYkg0V^ za)~&>F4Ye)e?K!b7n;ClmYD3|Nh9ydn4g|joDGbMjO-&+ujS6{w26q|mGwD9&P6Hh z)x{~@f|vPLW48fnI`eWOTf=O6c2QE=4n+ryh7I8O(%6$Ri?=6qy~-;P(JQDXUAlQQ z5Gv+RXp{FX>`}0B`z;P0C~RhJ#u>Nn9?7egw#F;l3F@aTDhoZdyCSaGP5qaEVv;Q@2t zVIrt3G>5DUk(mvrf)9YimI5Sk+s*3Bg^PDY&|jf&2^KQ{SiD78#CqH#Cd_U(IzT6p z!v|^wrF3G~Rk!snC8hN%M_-}Nder?C&1w2{eU8vmCY6CaEYlMz<}JKQr=TaSi{-Qt zYubGJwEf3Sv>qFtU)$7KOtK&Vw>*g7iAW`<-t9_-1(x44uhYnSc! zUBRkj9;#yWfxT>RfB*4=TpDkI)Mfon->8(=GTxJiDn>*b5xI?}W+>%XASG5Qjhykw z>((3WGediq;3&6K^`BsQ+S()4lkRUzH|cN#4Nw!~am|~x6N4d4*J=+fX?=A@0Zs>6 z6tQ9qb#bGvE5|ApYiAQl9PoT`JZIvypWh2y^N5&OUi;h{>>Mfu-{;HO690g&(4NuW zNmMNN05?Y@3sd+9VE5jF_6w!>Qs04`5(*?|e2yS8NXI{hQ=>I!%rcIquC1-rrRXU@ zn%I8egj^wnGu>p%jx2LMpya)pPD{tZ4>&kwrM^PLf+F8EoUxCcPRQ&SA#u(637Qjz zu+gppW(CoyttcKJY#3O~l{ey^POZK*5hAz?>iFS9{6?>le9KYdk8^Nbm0HhxUsk1h zC&h|$0qzk@pd6s|K~s><#9Dh#-dS`=)3f_q^X#oJ%gIqu`e4{(32;>hi7*+#E@U(L zzOTRkmFrI|RG*i~ICl;iM6gY+1qB5^e*CzZE9j2@>YlNn^zmg?C`WqMLA^@Gu*WM; zPijgZG);ow1d6QDAzC7oltH4l$?6TIKYkFA1<-a#EFY$umK^KE%h;Wd`oi`adIWd| zol-^ovL58TL-Y$NDdEN?W)o8E&tTY*i-mt*tCnnAeEunbjRoJE)g6 z5N1yx=j4=>XkduVZxbW7yv8(Q`EbG@=6r~uoIb!KY478_yh?kS#o1v7`O?@g(ptOe z5+E2c*rXDZ1*X)GbbUtnYaCc3C+K0g<9ra&A)A`uJbn5KBy3{P#OkU993xQ@9wzyV z9zv*g`H@3!^Q)1tVPd@vS@AHeU3?;%$oSBj$}ny<>ZAcboCqaligPafU*%{$$eD2E zk!q2L$LN8&6i^5-?N;}<^c0yEo5se%mg~_(t`nUs++r1ah40w0t)TW&^74BV?qn%$ zYTN`=mof5~7ru$-E-oyvNDv%xNt}=JhWLLbi=XwtRDJe;?W6wR|B0wHfSR$qIp&SN zS5(Ap{(QuYOLUGcD-<4ryC{wNEy>4$1|RqJY5yoL2AU*q&avhKZ6lGekN?xBR?oGe z>@D@)L6Qp*q{Pe!U$$mq(@{>&y>)eU#4#nS;F<%*=zlJH|a-3g)DJ&Sy+(a zeNlqT0U)%Yk)xM=jD>}mDn+W?MS@4&2bk#4#l$9e=n~n+$jdG~R}z2UxOVNZaHu?{ zL8+*yXcO8khku>Q!rX=DFuZJm(0Q7_NMMFSN{atsr_ua6uw^;8FS%Af*f*w<>imiT zK#n78@V|Qq1}g2%3ft%;Lx;nPB!yVtTf0Q{99pi5^i7D5=*`0cAUmHTA_cmw@7c|=d$_H7;GiN$LI;4N1c?H2DG=!;U_f>+UStnoia$?wRCZ2yxG*s?8lQ2D zlJ@L_kVT}JmVCz?^_sX8#W)oXBpV1k#%=s@4gMP6`A?jX{;U#jU`M-Y_(0N5E#7q$EK!xeb4_$29(t1Gp0+3C;;6msC{j(JJxy2HlI>q+Jk7 z$Xz(T`3bkr59l9+V_PuZALlyCeqsF5l`G$&^}AtiI))?oQ!d(S9EjNWXkHTsUg&UK zB>qiK^z+M;iLMl3OM{1^7-G`HCQ+iZMNHjcz`3ZcZLKpBM`#NvMocE1sL9Bp#RO-- zi6wf^@XGE7MToCn__l+YxB|?hgvGOA7;;Jxv=hR10K;GDgNoy)xfayau0>n)mXH&= zA)-pqv}f!3O!&qpMH%3d+GHJBlt4ipTlg8akQ^{DXjK!{G(t&7_X<=(GOjWoW~kwvl)l!J26C(GoHN%(1suE@+-~|`>o`yNV$4hrNix6yl7sL zR#)hZagYgLEC%{1UQ#fZK&Gt_+fE`>9aJF~`55!^>C;z0Gd%OX$1r;V2;7Y>{&|e8 zPZIeaQFLMk)T4aZ%r9(G2hlY-HO1p#LQ(iNjR{;2&wG@g|98(S%TutQ!zWH`CtO;< zF#DL96F+U2C73UXoc?Sf^)=5ySJ)KE9TXEiEktp3!kD zJ}^LtsPZel#Z65IiIu|2KEVk%)Ioq|XlUD!Fo{n#_JbzhN9-;_c*2?7ZZXl>acb@# zYbCSa>-ww2Mc#ysi;DtV{R7$x4@Rlb+9N@$`+@PD$1weT(Jbif)=>x(r6aB`Xv%Us z-RKqGG|`Qax(K=P0Q06vgiaI=$3Ge5=we41Qtc$p1R4s=pfyhrGMKe|41{zP){7no z2zpkxpV==D#SoJfFvPK7K7TMDFIB)e+WjA{l*B~KHQ1djZ*@7XaKQV@bN|OqOo38E zI^(c*9Ba!!-_E*~M&i2d6tBhfPWaUp;fbC?Yv6(uw|?z=GmZ&&uKYqARw6D?#s~vA zENy2*#&GmUm&pn&-USyZE}%8B`Ek{j%yRT`X&_ln)Fy4|kIlev?P*K_zJiPRJ_zL` z%sapXJ^=wSnM^XCkYNf7WY$3D4)vpRsNb0@go65F)0XYcX}MFqrM>uNppf~AaezRx zMpS(laGhR!0X&~4o045a;GY*IBw^FJ;TxFKEjd-;4s8mPNVS=!T1XFNMn^?K>EU#^ z4mV9)g+WI)ABi?J&H)6NP!+)jAAy>-+-T^q?(&4s3UO8u(J|W}+Z00R4#=bg#r&uc zo`Cx$nju72+G(l(pj6Nqg1yOo#E5mV#(9eH=xpiU&3Kf8hv^SG+ zT6#V2C$afvE$Iw|&Mhe^0^{P|GO|7JUXV+ees*`iGynF^|4EmN$38CHi?qadIUrM?IwkUn%dT*5MK4xME z=?&D9wO=)K?I2UCCPtPo;T0%^YLEWa2k>s)m{^tgcK}(}rKC>Chv-|;%N(+M^yup< z02%z@{jXTVxU;!Vp1jo4(<4R9IH?jNy|VB~f_F(l_L3XlK$KmS>cdLZgJ}7#I66A& zK+bY;Ps@ekOT+vu9)m-69HGl;nDHbK3)(LPzige$6@G(>RzmuR@YohI-)TQVP1!rM z0@rbVem-8?68$M+Wo1PcD3=gJFre7;1A}cluZ^vJ=l=U0GZ7pZT+%`q6Om5fN8()~ zf;N+ffz*jYlWNjIkMeyH_~a{O+Zcvl7AY{g5T_Z|!eZpyT8!Kloi~E#looSL1m_%W z&pJQ|VP(FoAXgr@(+na|LkS5QU&;e9H$~QjQv z=v#*1Wh;?@UN+cA z$8WqFbb~nDL{BmE(Gm1djJ+-@*AXoC-W79vX9d71(Qqqw^YrvH?Jaqgk&#inq@<*z zgLS5v$VfXb1m;xaZ!x5E`(JP7R-RoNp=dN(!VeIHY6x1{=HLL#;D_$RA$2e1zOD){ z-1|)wU43&pzdUBI)!X%I zlwQ`yV;r;fSg~fyrC&&Uue`kcp*CNF8h*pso7*Frm|K-HAwa4AuTPW^%8+|rA{k?N zJG06<3t-+I2nS6v2~2}3i^3#x7$e`5R8-FiUpJ=Pw%u5F?vGcEbD?1N!ikMl-|nOI zpI(1Kx-?<9{eSnqr#>ot+eM7<|Kfc1MZYaQUiRaS2B`YGkT}vR4x8-(Cle}0QmX|h zC;GA~F(Y+RJCG7Q!4U{o^?3gdXux<`$6#9q7oo5qcXp#<6D=i7W_eBIugKTgb~4+K z^1y+?3~GK3#QZfBWt5Hk=z|dPkLA!a?L<>K5-N~%1`s4j-x0Kk(B=&-qpmC$9|s4y zhxrNq5u#y6_;}75HSfdf6hp%Ss(N6$OuT9c;S`AX$CNojA1cMMHid66PHTB_5ifYy zVgr27E`NZD$?LN336%T2`t6xKgq`E{>&KuX|Jp27RcTAjq(byWFf4chP3pfj;SVia z2`d!_jkb$#teUSv@F8KMc<0vb+wY^rLo+b5uuzHvNyvrlcQR`q*|&5>xgN$CFgO|E zCv1#M3JUIegZy|954?p`G?DZLT@T`HG^glMppj(E>HBj(!S`&e;4JS4+J6%s&V}AU zs&IUs>i29R%nzNt!~V?69tT`V4R7VVXSgaP$0uLC1*| zK$Iwo1+xi9_Yn?s`F%*QQCiV;2LtY0z<3*9=!~nLo}R3-vU1eQU`D}OysInZFnPlj z)XWdr*|)FA%Ju{9C8G^UJU))Po9j<#e9@5Hw>ze*sHos!0t1@|v(Zfmb9IHL8P(|& z|K$r61qDUunvs!_l+;4|KsNBdG6cTH!G-sbjF8(bF%*^;JruRhU}$K_*A?pKwi~&> z&Y|Gw(WAvbetfvNaWzGw*D=g z0*$d_yWUPuo5dz1&;YoHYUKeinoV?yK@!a}kIBr+YBYR^^H&)vqFP>2aWPtPh)h9U z>8r4?a5>D~(YPxZd5fWB{#g*i>?kEATnM$T>#0vV!D}fgvrKzkI*0T&T|!}Zb;Ya; zzdo8fZ+|s5mZ2I%qg>uzFui#31<^=*f6c(_+(AkduYGK6Z1HRKdn~ZX;GdLgYHCxH zldo|Q%K?(36B6VxQALP$(vB3fehD>on5%8?=pf#kBqfD$FES?IV!JQ59k$%$vKi|t z(1aJX4`<&D?vlI_`U8VNin72t)2CJSDlG_gE1G=u`?;(8ZMpPO%OLbdJ3kFCf)c=gyef|Vi5=V@VDm>P+Y z6M;1qBeAwCAt6E9cm)aTIo=R+AFp(hp0oD{pZ~Cwl0U)#FoS6%_wA0qz`7Ro zqbFa;>nx^7vt3xs4=>><{Pl|pN^l{bdTO#;5(=OATqerCe&c6q?CLdTW$kO>;6z$z zS`v?sM(EiJV54rl&46$Kp(VK8^Ty4auE;t!Z{EBMSzP*|GrZ=+=z~Rpo(>lK6CM%6 z5ST>RBO@adKl0-F^FL6XGtK&UZ{N$%{Ac$xriYrFo6lBI7*`Ep4qEcY4eE5GmdKer zzKfV&K?BSU3r=T2sbzj`K;klR-DXFPHKm`ea15JSreH}s>#C6>9I1-J` z7y$WMQ9-!KudhW$MozXGCLVz_l41moO?nJPpyX2$hGU2d1b625%F4<=PFN!XVZ#LK zVV9>@jOD@9=Q%q&VfZTU>gc?{z~|YU6PP*sVVIcb0>09VCHR_=A%g*k;rJB17>INZ z?)MXNf!8MFF3I98U4>7#?fEl0>LIbQR8u89|LxfhqEU?t8dPhD$_}e-4-c52$P*0n zcJ`dTKrdjzK+Kh5ZT0<)o4;-X$p{p-H1I7=OHX%+i(>_y;zLz82a1V z*!;n_d;k4?M2kVfiGg5IaNT}$1i!kcr}q-{?9iH>C*gv{k+t-Xj@Ef54n+APG?bCB z!oq|kYBPCmWFShMx&Xord@Y;xZCb?;^(d<^($e^>Mw_3&<@5)-XEA8*U1Q^p(TOHn zl;~n)H<;odBee*OGy{*m$jcLhx1;5KJboC2`KbDgi?8nifSBvxeZP!DrAT)>>kpmd zN~g3I3G#Gg#4G3;w3G3Z=q8*dDDH6e~{Y9PD@mVku`P3@)(8i65vgu z(F(Ri9u^ixv{xU?NJu%N*}d3Qu>JxF9_`1?ByQx@s_R*|wY85SK)Cg)85Wn8?!ga0 zusaWlz|OWNJdjYt5N>8dI!2Ao&ePMtarjn}htFA1Tzg9KBlfc^?FMcRBz z>VpGF;7uQxb?JR!ECG5LG(xP}J=5{tAv`(AUJgjN4=w|+)-5&`>BXI$OxWqIB=kxn zGBa zDA4S9mXTqd;?aipg^@PaOvFuy9KB9{79GF$ot8`n0uMW%V{8CznO~{o(E;>ZLf=U_ zcDEs-x_f#Q6UR`_uf;0wBqujkd>`QN9|<82izeIz9$Cl0CsvL03W?+bn%ufAV4&SY zL$A;?dEk{vK38(+;d^W(bV-9+e%KvE9TxWy#v?pA;VKRcq>a)nqQ!6^(EzWW?^+wT zCijQXvlAw#cdS1`(R#y<5^r4rANl?hvn_%j*xnk@9K3-$&PB zNsK?ASc59^6>m<-%+BudRS-Xq*GC}Lz77lXYHe+e>C~{ZO=@jehsR_^r%w15;P8P$8@_ ze)8q1qM{TS{*s7@GrQB%RXz=kjceN5+fh(2r*=aV>h$2DEaB43zT5TntAXPY=M0`~ zx^&jrvu8JUEI_%HFhDPQJ(8#4jX=}kie-G&aOB-}e~xGA{OvzX*3lXL)mL8yD@&(p zPBy6V0)=D9X5Ut5+#y*?vGGI#e=0A}=txpZ$|T~2yRBYb-&fWTf04ve0J9I^_0+cs zdAt~qhImIl+&M)W$*#{!_whlX0L?7c4kh)$;g{T8CLABNx)Dn!dN2XWJIOT0RL=2^KF4QwbGMZupD| z6DCyMxUmcJ+JvmEEYTUG6AL;7u3+sP4xaqFuW5iW$WyMbvD)xES6kbBOMhv- z!!D~c9q2J=RP5>Obqz8>F}65u?c84-B{_4tt^1!RVM%O$)upa_b|=pkb2SW|Oe-vb zei+NJOY)VSXknm&mNnez_S>*TR&2$cjla-(E0;;+Kn{xAWkK?qX6{gWWBX48p21lW% zmt8AEegQ~YNFEM|_87&8g~EA2pFl6eNqw?6`V#bT7$msR5J1$KD+9%i{oJ_h!e%000 ztx!taf2sfyBYB8z@KQ2J|pz2&Wa;pGP+XM$2V6Py$08&)}3BvOi zE{sh~)FjXe;)4h9Av^%I0E9Ua9!a_dJJN-h=HTM;Ibwqih&}xIKdc4AYIJ&_0O%@p&6zMem7O=vl1mVHjD+`lxw0~- zV;^!}kXL{D^l2)RAqd5x=$;QO4Qc&Jh%y_`$~57pkgy-I?{^3zN5K~!t)anMr+e$x zEhCB2lE_?;T}kfif7iJsv#@X?ke3QjDMY0X8{=2)m}g%$aQChkV(In_4fYpbj9|0b zu>5b)@ijg^JdxI{5y65{Acrfh&L_057uwX8oUfpbkEvhU&9>=WaiY+Xy5K^!^_k36ba$#r@NQ-Qwi$bJl2$O+oZkPsh|71_0e3R{ zr<9Z`Kzv2TrmdsP5O)GEfBfl2|yKKb*Fs_go>ygnF^hu7sf^F z%}nFA=YdhWebbQ-GLJ@c;Bvt)r?)oIRjv9v2L{w?H7{PjJ_eCM4E#O7W}@zQ<;&ae zk z3mm9~oez~txsX8;?IH9KGeIkluk8=Di;Rrij13uulWz4*!%n*hNEQz5gPv_IE&Q6s z=a8P}m^PeaI6FH-0OSSa@UitFm@m*POqhGG!IbM)v^ zIPZWLxItSGnZN!$k$I@N7!W*=&{o9NF8~k*=?V20E+mDdGx(N?QQj+89@sRXVjUQ&ZE7lUd9ftvxj5 zk2l%JQ2uNW41|;njE_fkO!i|{TU+*LO_-Z1P}%L(QW3UlB1b`n@A|EGE?#`FC10YO z9vmfZ6yV`M;KPBoSG4u*in-zcgyGxj%q#*|PEdIC-|m}l&f7$7pUFue zn6+3eM%u{c*j_jqaF}_(013mD7P&Ls2|+MrKL}__G&WjD)hA+5Ujf+Fnr6!-?j(E* z1B-LNe?p;*+CY9Iz_;|Y@4bRMCEP>0Y8k%kaRl07on!R{xRpa_WRvA`v8k!t#ycXy z9QOUi>^sFFx-i1@pz!pRxVTXi>YO=hlxCGm)6tO-&Wo~KrdpCjHtkun#<{z@SMR=1 z@Y`_XUiJ0$p)y$og0^iMhLqEhFBuT~Y$avqgZhxhHXhtGh#DQ~xfCyehBXkQWdHzJ zm|5&P1r@b{u4Ez@!v^bE+KYajziX=b2r}G zRwT;4(F^21vlyk)DJX=fwX3N#Vgk4vQYlFETT5RHKves(?Fe)!>v~D25s(mY_r^Ey zbet5N+4I(t=i-b*G|~0q1?%id#L#bgI})MFE>jVi0%%<$Kpb0o+I-o=X-Xjr}XmvPxwb!D{Z4am3g@4oq z4(}k;9QHjJ`mJ~iWM{?MH$XeO5GyMVq<1rzQgM5>Nfm5Bd&-nJRGTAuWGFcO8X(>U$U+gj!|eRz{Qp z0@8yoOR#5P>bDIVHk~X4A_`x{n;gd0*5!83Y$XVxU^z=jbkb&8UVE2`!rVhlV^`5qb-n@;wZkhD_ZHfEBW?AQ!QZt-Nu=8E?YnK16khsIuZKi$UHx!0C(sI+5dX z<<>1%044K~RJC{S-ojp#s)zyP;D_D1=CKONvhjFbOm$vSQAl3YHUB)Se5?uCyg&u) z009I98LY3&>Yx;?22l(GqJ{iCcBAcL8tQf1sm+MKzSrE9%f%~P{^gg0HhqzuWwhJ3 zZ@&PRMmQ!9PfxZ-<;9CO=lkCTA&$aW91q|3j`@;bB2D zI|7uP*`{aHpEZ>yVW(RQND!uK=j5b?E$bAr4D`zCv2Kl^9Y$t^XHX<+S}Qdl_4k&P zKLE4gqzEZObUQ}ZWDFv7f*e3J<#UpQyjfCC2E;=gIDCJc2Cpiu`*EhPL4cHrOa{We z!PrQ71*pF}Pc z5;BORqRqL|*f^ayDzUL@z*k27^#`|bL*+fPs^YL5fmJft2@%Pjbk z5C%^m@fR}WA))v=9}30NS{};d2MMKAe_=qNm_zG4S5Bh_3OF=(wv(Y#sI72a;Ma;U zp{v5#jjssen+s^xRvMOa3p5ZSl=7(ZkYI7Rg`7hhY}W#RldqXHTofh{S-5cRhcCe= z4sD%O8fw90ZrZeovFS^OBrJewWNvQGG-NSZEIO{BhewE|JULw)J_jvmPzT%K3d8wf zfuYhsiI_^-c~YUk zie<<$q#Lp5MrM}Gzx<0lSFAp?`{BF6 zYb}{%bb|wj24(QW@Tk0RcxcFmF8tH9{QapC@ZV2Us4Ogaa0v+bOkuDvL@1V$NirIq zBmv(-8Ym4GewZSgVClzGgtcc8%o7K2XmYv$<0%W4(yZKs_&J9#9$!l3O9X-9fPc}e z;f5@ke|pA$(I=R~`%aOyH)vpF)ya9Ge_D08%wll0NW$DCl3*)ao_HhAlKI!KvFHbf r{-fa?`U=JbvtqtCK74p@zCtl Date: Sun, 27 Dec 2020 09:34:02 +0530 Subject: [PATCH 61/72] Update Shortest_Dist.java Added Comment lines Prompted user to enter the words between which the distance is to be determined --- Java/cp/Shortest_Dist.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Java/cp/Shortest_Dist.java b/Java/cp/Shortest_Dist.java index cd6bc9f00d..3c81762976 100644 --- a/Java/cp/Shortest_Dist.java +++ b/Java/cp/Shortest_Dist.java @@ -22,9 +22,11 @@ public static void main(String args[]) { List < String > wd = new ArrayList(arr); while (t > 0) { + System.out.println("Enter the words between which the shortest distance is to be calculated"); String wd1 = sc.next(); String wd2 = sc.next(); System.out.println(" The shortest Distance between " + wd1 + " and " + wd2 + " is : " + shortest_dist(wd, wd1, wd2)); + //List<> wd is being allocation with elements of Collection arr wd = new ArrayList(arr); t--; @@ -34,6 +36,7 @@ public static void main(String args[]) { public static int shortest_dist(List < String > wd, String wd1, String wd2) { int dist = -1; List < String > wdcopy = new ArrayList(wd); + //list <> ind1. List <> ind2, for storing indexes of wd1, wd2 in List <> wd List < Integer > ind1 = new ArrayList <> (); List < Integer > ind2 = new ArrayList <> (); @@ -54,6 +57,7 @@ public static int shortest_dist(List < String > wd, String wd1, String wd2) { for (int i = 0; i < ind1.size(); i++) { for (int j = 0; j < ind2.size(); j++) { + //calculating distance between the indexes int d = (int) Math.abs(ind1.get(i) - ind2.get(j)); if (dist == -1) dist = d; From 1674e5f603ef8b6e94c6db047c0d7ac1a924d264 Mon Sep 17 00:00:00 2001 From: Bharati2612 <2020pcs1009@iitjammu.ac.in> Date: Sun, 27 Dec 2020 10:11:13 +0530 Subject: [PATCH 62/72] Added the beginner pitch and did required changes to readme file as well --- C-Plus-Plus/README.md | 3 +++ C-Plus-Plus/dp/Egg_Dropping.cpp | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/C-Plus-Plus/README.md b/C-Plus-Plus/README.md index 920aab4e3f..da2051b438 100644 --- a/C-Plus-Plus/README.md +++ b/C-Plus-Plus/README.md @@ -77,6 +77,7 @@ - [Post-order (LRN) Tree Traversal](graphs/Postorder_Traversal.cpp) - [Pre-order (NLR) Tree Traversal](/graphs/Preorder_Traversal.cpp) - [Prim's Algorithm](graphs/Prim_Algorithm.cpp) +- [Depth First Search Algorithm](graphs/DFS.cpp) ## Searching @@ -132,6 +133,8 @@ _add list here_ - [Minimum Sum Partition](dp/Minimum_Sum_Partition.cpp) - [Implement Floyd-Warshall Algorithm](dp/floyd_warshall.cpp) - [Rectangle Cutting Problem](dp/Rectangle_cutting.cpp) +- [Partition Problem](dp/Partition_Problem.cpp) +- [Egg Dropping Problem](dp/Egg_Dropping.cpp) ## Blockchain diff --git a/C-Plus-Plus/dp/Egg_Dropping.cpp b/C-Plus-Plus/dp/Egg_Dropping.cpp index a609a1c882..77d34bfc6d 100644 --- a/C-Plus-Plus/dp/Egg_Dropping.cpp +++ b/C-Plus-Plus/dp/Egg_Dropping.cpp @@ -1,4 +1,18 @@ //Egg Dropping problem +/* +The Egg Dropping Problem: There is a building with k floors. You are given n eggs. + +An egg dropping from any floor is termed a “trial”. After a dropping, an egg can either survive or +break. A broken egg cannot be used whereas a survived egg can be used for another trial. All eggs are +identical, i.e. effect must be same for all eggs. + +A floor is called the critical floor if an egg breaks from that floor and above but does not break from +any floor below that one. We assume that if an egg survives a fall, it survives a shorter fall. And if an +egg breaks from some floor, then it would break from higher floor also. + +Given n and k, you have to find the minimum number of trials in the worst case. +*/ + #include using namespace std; From 547017b4bb23ad7ea02853e62b4064d18bbd2794 Mon Sep 17 00:00:00 2001 From: Rutuja Dhanawade <53823042+rutujadhanawade@users.noreply.github.com> Date: Sun, 27 Dec 2020 12:31:11 +0530 Subject: [PATCH 63/72] added Unique BST in C --- C/dp/Unique_BST.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 C/dp/Unique_BST.c diff --git a/C/dp/Unique_BST.c b/C/dp/Unique_BST.c new file mode 100644 index 0000000000..9b40d02641 --- /dev/null +++ b/C/dp/Unique_BST.c @@ -0,0 +1,40 @@ +// Unique BSTs using DP +// Given n, how many structurally unique BST's that store values 1 ... n? +#include + +int max(int num1, int num2) +{ + return (num1 > num2) ? num1 : num2; +} + +int uniqueBST(int n) +{ + int count[n + 1]; + for (int i = 0; i < n + 1; i++) + count[i] = 0; + // for each 'i' number of nodes + for (int i = 1; i <= n; ++i) { + for (int j = 0; j < i; ++j) { + // No. of trees if j is a root + count[i] += max(count[j], 1) * max(count[i - j - 1], 1); + } + } + return count[n]; +} + +int main() +{ + int n; + printf("Enter the number: \n"); + scanf("%d", &n); + int num = uniqueBST(n); + printf("Number of Unique BSTs %d is: \n", num); + return 0; +} + +/* input: +Enter value:3 +output: +Number of Unique BSTs 5 +Time complexity : O(n^2) +*/ From bd1d464d62e023aac40a93d5c78ab7da4f6538a7 Mon Sep 17 00:00:00 2001 From: Rajiv Singh Date: Sun, 27 Dec 2020 12:43:44 +0530 Subject: [PATCH 64/72] removed whitespaces --- C-Plus-Plus/cp/Josephus.cpp | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/C-Plus-Plus/cp/Josephus.cpp b/C-Plus-Plus/cp/Josephus.cpp index 9decf73d14..cde6397525 100644 --- a/C-Plus-Plus/cp/Josephus.cpp +++ b/C-Plus-Plus/cp/Josephus.cpp @@ -1,6 +1,6 @@ /** Josephus problem is a famous problem. -In each iteration we kill the every kth +In each iteration we kill the every kth person in a circular arrangement of n persons. Find the person who is alive at the end. 0-based indexing @@ -10,27 +10,25 @@ link to the problem : https://en.wikipedia.org/wiki/Josephus_problem #include using namespace std; -int solution(int n, int k){ - if(n == 1) - return 0; - return (k+solution(n-1,k))%n; +int solution(int n, int k) { + if (n == 1) + return 0; + return (k + solution(n - 1, k)) % n; } int main() { - int people, gap; - cin >> people >> gap; - cout << solution(people, gap) << '\n'; - return 0; + int people, gap; + cin >> people >> gap; + cout << solution(people, gap) << '\n'; + return 0; } /** - -Input : -4 2 +Input : +4 2 Output : -0 +0 Time Complexity : O(n) Space Complexity : O(1) - -**/ \ No newline at end of file +**/ From cd70bf2cbd4abd6b9e6cef0ad9555e7c4b4ec714 Mon Sep 17 00:00:00 2001 From: Pranav <54665036+Pranav016@users.noreply.github.com> Date: Sun, 27 Dec 2020 12:48:56 +0530 Subject: [PATCH 65/72] Added Breadth First Search in Python formatted with Pep8 (#1569) --- Python/README.md | 1 + Python/graphs/BFS.py | 101 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 Python/graphs/BFS.py diff --git a/Python/README.md b/Python/README.md index 978398cfad..df4fd04d3a 100644 --- a/Python/README.md +++ b/Python/README.md @@ -106,6 +106,7 @@ - [Directed Acyclic Graph](graphs/Directed_Acyclic_Graph.py) - [Detect Negative Cycle](graphs/Negative_Cycle.py) +- [Breadth First Search](graphs/BFS.py) ## Competitive Programming diff --git a/Python/graphs/BFS.py b/Python/graphs/BFS.py new file mode 100644 index 0000000000..b5c431881f --- /dev/null +++ b/Python/graphs/BFS.py @@ -0,0 +1,101 @@ +# Breadth First Search for a Graph +import queue + + +class Graph: + def __init__(self, vertices): + self.vertices = vertices + self.adjMatrix\ + = [[0 for j in range(self.vertices)]for i in range(self.vertices)] + + def addEdge(self, v1, v2): + self.adjMatrix[v1][v2] = 1 + self.adjMatrix[v2][v1] = 1 + + def removeEdge(self, v1, v2): + if self.containsEdge(v1, v2): + self.adjMatrix[v1][v2] = 0 + self.adjMatrix[v2][v1] = 0 + + def containsEdge(self, v1, v2): + ''' + Summary line- + Helps us to check whether a particular + edge is present in a graph or not. + ''' + if self.adjMatrix[v1][v2] != 0: + return True + else: + return False + + def __str__(self): + return str(self.adjMatrix) + + def bfsHelper(self, sv, ev, visited, path): + ''' + Summary line- + Helps us to perform breadth first search in the graph using a queue. + + Working- + We use the visited list to mark `True` for every element we visit. + We get the elements from the queue, + mark it visited and push its neighboring vertices. + + Variable names- + sv- Starting vertex + ev- Ending vertex + ''' + q = queue.Queue() + q.put(sv) + visited[sv] = True + while not q.empty(): + cur = q.get() + for i in range(self.vertices): + if self.adjMatrix[cur][i] > 0 and visited[i] is False: + path[i] = cur + if i == ev: + print(ev, end=" ") + return True + q.put(i) + visited[i] = True + + def bfs(self, sv, ev): + visited = [False for j in range(self.vertices)] + path = dict() + if self.bfsHelper(sv, ev, visited, path) is True: + return path + return dict() + +if __name__ == "__main__": + print("Enter no of vertices and edges-") + v, e = map(int, input().split()) + if v > 0 and e > 0: + g = Graph(v) + for i in range(e): + print("Enter vertices having edge between them-") + v1, v2 = map(int, input().split()) + g.addEdge(v1, v2) + print("Enter starting and ending vertex") + sv, ev = map(int, input().split()) + path = g.bfs(sv, ev) + x = path.get(ev, -1) + while x != -1: + print(x, end=" ") + x = path.get(x, -1) + +''' +Sample input- +4 4 +0 1 +0 3 +1 2 +2 3 +1 3 + +Sample output- +3 0 1 + +Time Complexity: O(V+E) where V is number +of vertices in the graph and +E is number of edges in the graph. +''' From 7da6e8338b33e4fa6dc543ca7a7a443143654360 Mon Sep 17 00:00:00 2001 From: kartikp36 <36930635+kartikp36@users.noreply.github.com> Date: Sun, 27 Dec 2020 12:49:20 +0530 Subject: [PATCH 66/72] Add knapsack01 (#1659) * Add Knapsack_01.py * Update README.md for Knapsack 01 --- Python/README.md | 1 + Python/dp/Knapsack_01.py | 67 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 Python/dp/Knapsack_01.py diff --git a/Python/README.md b/Python/README.md index df4fd04d3a..71a9be53e7 100644 --- a/Python/README.md +++ b/Python/README.md @@ -80,6 +80,7 @@ - [Unique BST with N nodes](dp/Unique_BST.py) - [Edit Distance](dp/EditDistance.py) - [Knapsack Unbounded](dp/Knapsack_Unbounded.py) +- [Knapsack 0-1](dp/Knapsack_01.py) - [Ugly Numbers](dp/Ugly_Numbers.py) - [Dice Throw Problem](dp/Dice_Throw.py) - [Partition Problem](dp/Partition_Problem.py) diff --git a/Python/dp/Knapsack_01.py b/Python/dp/Knapsack_01.py new file mode 100644 index 0000000000..e0728e9a49 --- /dev/null +++ b/Python/dp/Knapsack_01.py @@ -0,0 +1,67 @@ +""" +Knapsack 0-1 problem using dp (0-1 means we either choose it or we don't, no fractions) +Given weights and their corresponding values, +We fill knapsack of capacity W to obtain maximum possible value in bottom-up manner. +N: Number of (items)weight elements +W: Capacity of knapsack +Time Complexity: O(N*W)(Looping through the matrix) +Space Complexity: O(N*W)(Space taken by matrix - knapsack_table) +""" + + +def knapsack(capacity, weights, values): + # 'items' variable represents number of weight elements + items = len(weights) + + # Initializing knapsack_table values as 0 + knapsack_table = [[0 for x in range(capacity + 1)] + for x in range(items + 1)] + + # Updating knapsack_table[][] in bottom up manner + for i in range(items + 1): + + # Note that list is 0-based, so to get i_th item we do i-1 + for j in range(capacity + 1): + + # i=0 means no items available to put + # j=0 means no capacity remains to be filled + if i == 0 or j == 0: + knapsack_table[i][j] = 0 + + # Weight of item is greater than current capacity, so we cannot use it + # So knapsack value here is the best we can do without this item ie. with the (i-1)th item + elif weights[i-1] > j: + knapsack_table[i][j] = knapsack_table[i-1][j] + + # Weight of item is less than current capacity, so we can use it to optimize knapsack + else: + knapsack_table[i][j] = max( + # If i_th item is included, + # knapsack value is equal to it's value + best we can do(ie. value of knapsack_table): + # 1) without this item(with the previous one) and + # 2) capacity being current capacity(j) - weight of i_th item + values[i-1] + knapsack_table[i-1][j-weights[i-1]], + knapsack_table[i-1][j]) # i_th item is not included + + return knapsack_table[items][capacity] + + +if __name__ == '__main__': + + print("Enter Capacity:") + capacity = int(input()) + print("Enter weights:") + weights = list(map(int, input().split())) + print("Enter values:") + values = list(map(int, input().split())) + + print(knapsack(capacity, weights, values)) + +""" +Sample Input: +capacity = 50 +weights = 1 5 10 +values = 10 50 100 +Sample Output: +160 +""" From 49ddf877fda414c1e8db76294180b18bd99f9d32 Mon Sep 17 00:00:00 2001 From: Rutuja Dhanawade <53823042+rutujadhanawade@users.noreply.github.com> Date: Sun, 27 Dec 2020 13:11:50 +0530 Subject: [PATCH 67/72] Update README.md --- C/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/C/README.md b/C/README.md index 1856453dbd..e7a18d8cfd 100644 --- a/C/README.md +++ b/C/README.md @@ -87,6 +87,7 @@ - [Max_Sum_Rectangle_Matrix](dp/Max_Sum_Rectangle.c) - [Implement Floyd-Warshall Algorithm](dp/floyd_warshal.c) - [House Robber](dp/houseRobber.c) +- [Unique BST](dp/Unique_BST.c) ## Graphs From ea53c9851547d2dd00caf43805a3d392504bb91c Mon Sep 17 00:00:00 2001 From: Rajiv Singh Date: Mon, 28 Dec 2020 07:16:43 +0530 Subject: [PATCH 68/72] formatted code --- C/dp/Unique_BST.c | 49 +++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/C/dp/Unique_BST.c b/C/dp/Unique_BST.c index 9b40d02641..3b81e32514 100644 --- a/C/dp/Unique_BST.c +++ b/C/dp/Unique_BST.c @@ -1,38 +1,37 @@ // Unique BSTs using DP // Given n, how many structurally unique BST's that store values 1 ... n? + #include -int max(int num1, int num2) -{ - return (num1 > num2) ? num1 : num2; +int max(int num1, int num2) { + return (num1 > num2) ? num1 : num2; } -int uniqueBST(int n) -{ - int count[n + 1]; - for (int i = 0; i < n + 1; i++) - count[i] = 0; - // for each 'i' number of nodes - for (int i = 1; i <= n; ++i) { - for (int j = 0; j < i; ++j) { - // No. of trees if j is a root - count[i] += max(count[j], 1) * max(count[i - j - 1], 1); - } - } - return count[n]; +int uniqueBST(int n) { + int count[n + 1]; + for (int i = 0; i < n + 1; i++) + count[i] = 0; + // for each 'i' number of nodes + for (int i = 1; i <= n; ++i) { + for (int j = 0; j < i; ++j) { + // No. of trees if j is a root + count[i] += max(count[j], 1) * max(count[i - j - 1], 1); + } + } + return count[n]; } -int main() -{ - int n; - printf("Enter the number: \n"); - scanf("%d", &n); - int num = uniqueBST(n); - printf("Number of Unique BSTs %d is: \n", num); - return 0; +int main() { + int n; + printf("Enter the number: \n"); + scanf("%d", &n); + int num = uniqueBST(n); + printf("Number of Unique BSTs %d is: \n", num); + return 0; } -/* input: +/* +input: Enter value:3 output: Number of Unique BSTs 5 From 26b20c30ad17bd519647017c6b91bc1ff500fb4d Mon Sep 17 00:00:00 2001 From: Rajiv Singh Date: Mon, 28 Dec 2020 07:26:30 +0530 Subject: [PATCH 69/72] formatted code --- Java/cp/Shortest_Dist.java | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/Java/cp/Shortest_Dist.java b/Java/cp/Shortest_Dist.java index 3c81762976..1b7ca881d0 100644 --- a/Java/cp/Shortest_Dist.java +++ b/Java/cp/Shortest_Dist.java @@ -1,5 +1,6 @@ -/* Given a list of words and two words word1 and word2, find the shortest distance between those two words from the list. - */ + +// Given a list of words and two words word1 and word2, find the shortest distance between those two words from the list. + import java.util.*; class Shortest_Dist { static List < String > arr; @@ -69,22 +70,26 @@ else if ((dist != -1) && (d < dist)) } } -/*Sample Input And Output : - * Enter the list of words -Words = + +/* +Sample Input And Output : +Enter the list of words +Words = practice makes perfect coding makes 2 +Enter the words between which the shortest distance is to be calculated practice coding - The shortest Distance between practice and coding is : 3 +The shortest Distance between practice and coding is : 3 +Enter the words between which the shortest distance is to be calculated coding makes - The shortest Distance between coding and makes is : 1 - - Timple Complexity : O(n) - Space Complexity : O(1) - */ +The shortest Distance between coding and makes is : 1 + +Timple Complexity : O(n) +Space Complexity : O(1) +*/ From 3cc0c94fd50c28386b9d86001f4f18adc57e4c73 Mon Sep 17 00:00:00 2001 From: Akash Kumar Bhagat <43098511+charlie219@users.noreply.github.com> Date: Mon, 28 Dec 2020 07:45:37 +0530 Subject: [PATCH 70/72] Bellman_Ford.py added under Graphs (#1727) * Bellman Ford added * README.md Updated * Minor Changes --- Python/README.md | 4 +- Python/graphs/Bellman_Ford.py | 151 ++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 Python/graphs/Bellman_Ford.py diff --git a/Python/README.md b/Python/README.md index 71a9be53e7..276b14db30 100644 --- a/Python/README.md +++ b/Python/README.md @@ -88,6 +88,7 @@ ## Graphs +- [Breadth First Search](graphs/BFS.py) - [Depth of Tree](graphs/Depth_Of_Tree.py) - [Height of Tree](graphs/height_of_given_tree.py) - [Kruskal's Algorithm](graphs/Kruskal_Algorithm.py) @@ -106,8 +107,7 @@ - [Bridge Edge in Graph](graphs/Bridge_Edge_in_Graph.py) - [Directed Acyclic Graph](graphs/Directed_Acyclic_Graph.py) - [Detect Negative Cycle](graphs/Negative_Cycle.py) - -- [Breadth First Search](graphs/BFS.py) +- [Bellman Ford](graphs/Bellman_Ford.py) ## Competitive Programming diff --git a/Python/graphs/Bellman_Ford.py b/Python/graphs/Bellman_Ford.py new file mode 100644 index 0000000000..013f9c6f07 --- /dev/null +++ b/Python/graphs/Bellman_Ford.py @@ -0,0 +1,151 @@ +""" +Bellman Ford : In a Directed Graph, the shortest distance between the + source to destination can be calculated by Dijkstra's Algorithm. + But in case of negative weight, Dijkstra's Algorithm would fail. + Bellman Ford is a pathfinding algorithm which even works in negative + cycle + +Purpose: Given a Directed Weighted Graph with N nodes and M edges, where + each edge possesses an integer weight and a source and destination. + Find the minimum path sum from source to destination. + +Method: Bellman-Ford Algorithm +Intuition: Below is algorithm find if there is a negative weight cycle + reachable from the source. + 1) Initialize distances from the source to all vertices as infinite and + distance to the source itself as 0. Create an array dist[] of size N with + all values as infinite except dist[src] where src is source vertex. + 2) This step calculates the shortest distances. Do the following N-1 times where + N is the number of vertices in the given graph. + (*) Do following for each edge u-v + If dist[v] > dist[u] + weight of edge uv, then update dist[v] + dist[v] = dist[u] + weight of edge uv + 3) This step reports if there is a negative weight cycle in the graph. Do following + for each edge u-v + If dist[v] > dist[u] + weight of edge uv, then “Graph contains negative + weight cycle” + 4) If the graph does not contain any negative cycle, return the distance[source] + +Time Complexity: O((N^2)*M) +Space Complexity: O(N) + +Argument: Dictionary ( Graph with nodes numbered 1 to N ) +Return : Boolean ( The graph contain negative cycle or not ) +""" +from collections import defaultdict + + +def Bellman_Ford(n, graph, start, end): + + # Initilize the distance of each node to infinite + distance = [float('inf') for i in range(n + 1)] + + # Considering source vertex as 1, puting distance[1]=0 + distance[start] = 0 + + # To keep a count of iteration + x = 0 + while True: + + # To keep a track of any updation + boo = False + + # Check for each node and each edge + for i in graph.keys(): + for j in graph[i].keys(): + + # Updation of the distance if the condition satisfies + if distance[j] > distance[i] + graph[i][j]: + boo = True + distance[j] = distance[i] + graph[i][j] + + # If there is no updation, then break the loop + if not boo: + break + x += 1 + + # If the iteration exceeds the number of nodes, that means + # the graph has a Negative Cycle + if x > n: + return False + + return distance[end] + +# -------------------------------DRIVER CODE --------------------------------- + + +if __name__ == "__main__": + n, m = map(int, input("Enter the number of vertex and edges: ").split()) + print("Enter the edges: ") + + graph = defaultdict() + for i in range(1, n + 1): + graph[i] = defaultdict(int) + + # Initializing the Directed Graph + for i in range(m): + a, b, w = map(int, input().split()) + graph[a][b] = w + + # Input Source and destination + src, dst = map(int, input("Enter the Source and Destination ").split()) + + # Calculating answer by calling the Bellman_Ford() function + distance = Bellman_Ford(n, graph, src, dst) + + if distance is False: + print("The Graph has a Negative Cycle") + print("Minimum Distance between the Source and Destination is: - Infinity") + else: + print("Minimum Distance between the Source and Destination is: ", distance) + +""" +Sample Input - Output + + -4 -1 5 + (1)--------->(2)-------->(3)--------->(6) + ^ / / + \ / / + \ / 2 / 3 + 1 \ / / + \ / / + \V V + (4) (5)<---------(7) + -2 + +Enter the number of vertex and edges: 7 7 +Enter the edges: +1 2 -4 +4 1 1 +2 3 -1 +2 4 2 +3 6 5 +3 5 3 +7 5 -2 +Enter the Source and Destination 4 7 +The Graph has a Negative Cycle +Minimum Distance between the Source and Destination is: - Infinity + + + -4 -5 + (1)----------->(2)------------->(5) + ^ | + | | + -2 | | 3 + | | + | | + | V + (3)<-----------(4) + 5 + +Enter the number of vertex and edges: 5 5 +Enter the edges: +1 2 -4 +3 1 -2 +2 5 -5 +2 4 3 +4 3 5 +Enter the Source and Destination 1 4 +Minimum Distance between the Source and Destination is: -1 + +""" From 148046095d81545ed3d45aa9dd335c6163055c3a Mon Sep 17 00:00:00 2001 From: Harsh Bardhan Mishra <47351025+HarshCasper@users.noreply.github.com> Date: Mon, 28 Dec 2020 17:52:37 +0530 Subject: [PATCH 71/72] feat: Added the Slack Workspace Link --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 9998084e1f..1a2d4cc679 100644 --- a/README.md +++ b/README.md @@ -57,3 +57,7 @@ You can find our Code of Conduct [here](/CODE_OF_CONDUCT.md). ## License This project follows the [MIT License](/LICENSE). + +## Slack + +[![Slack](https://img.shields.io/badge/chat-on_slack-purple.svg?style=for-the-badge&logo=slack)](https://join.slack.com/t/tesseractcodi-bxq5968/shared_invite/zt-ju6c0nqq-KgkTvFyxjNVbDRBIjADanw) From 9042a94a76939483886de9f8cd462aa33f54d001 Mon Sep 17 00:00:00 2001 From: Harsh Bardhan Mishra <47351025+HarshCasper@users.noreply.github.com> Date: Tue, 29 Dec 2020 10:47:24 +0530 Subject: [PATCH 72/72] Added Resources README --- Resources/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Resources/README.md diff --git a/Resources/README.md b/Resources/README.md new file mode 100644 index 0000000000..d5b83ba911 --- /dev/null +++ b/Resources/README.md @@ -0,0 +1,3 @@ +# Resources + +Everything you need to know to ace Data Structures and Algorithms 🙌