aboutsummaryrefslogtreecommitdiff
path: root/challenge-145
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-01-03 02:25:09 +0000
committerGitHub <noreply@github.com>2022-01-03 02:25:09 +0000
commit00f91e8d94badf473a1e379ccfdbfd9b09f43806 (patch)
tree1ca51f28dd40baa9596570c5833bb4e2244a5032 /challenge-145
parent6076f2ea2366c92cf87dc2b540d8bb2358c38ec1 (diff)
parent8983e2a4454b6bd40f6fe00dbeff0b4c6b8365ad (diff)
downloadperlweeklychallenge-club-00f91e8d94badf473a1e379ccfdbfd9b09f43806.tar.gz
perlweeklychallenge-club-00f91e8d94badf473a1e379ccfdbfd9b09f43806.tar.bz2
perlweeklychallenge-club-00f91e8d94badf473a1e379ccfdbfd9b09f43806.zip
Merge pull request #5451 from anwarthebest/branch-for-challenge-145
palindrome tree cpp code from mohammad khalid anwar
Diffstat (limited to 'challenge-145')
-rw-r--r--challenge-145/khalid/cpp/ch-2.cpp210
-rw-r--r--challenge-145/khalid/perl/ch-1.pl13
2 files changed, 223 insertions, 0 deletions
diff --git a/challenge-145/khalid/cpp/ch-2.cpp b/challenge-145/khalid/cpp/ch-2.cpp
new file mode 100644
index 0000000000..7d3b461178
--- /dev/null
+++ b/challenge-145/khalid/cpp/ch-2.cpp
@@ -0,0 +1,210 @@
+// C++ program palindromic tree by khalid anwar
+#include "bits/stdc++.h"
+using namespace std;
+#define MAXN 1000
+
+struct Node
+{
+
+ // store start and end indexes of current
+ // Node inclusively
+ int start, end;
+
+
+ // stores length of substring
+ int length;
+
+
+ // stores insertion Node for all characters a-z
+ int insertEdg[26];
+
+
+ // stores the Maximum Palindromic Suffix Node for
+ // the current Node
+ int suffixEdg;
+
+};
+
+// two special dummy Nodes as explained above
+ Node root1, root2;
+
+// stores Node information for constant time access
+ Node tree[MAXN];
+
+// Keeps track the current Node while insertion
+int currNode;
+
+string s;
+
+int ptr;
+
+
+void
+insert (int idx)
+{
+
+//STEP 1//
+
+ /* search for Node X such that s[idx] X S[idx]
+ is maximum palindrome ending at position idx
+ iterate down the suffix link of currNode to
+ find X */
+ int tmp = currNode;
+
+while (true)
+
+ {
+
+int curLength = tree[tmp].length;
+
+if (idx - curLength >= 1 and s[idx] == s[idx - curLength - 1])
+
+break;
+
+tmp = tree[tmp].suffixEdg;
+
+}
+
+
+ /* Now we have found X ....
+ * X = string at Node tmp
+ * Check : if s[idx] X s[idx] already exists or not*/
+ if (tree[tmp].insertEdg[s[idx] - 'a'] != 0)
+
+ {
+
+ // s[idx] X s[idx] already exists in the tree
+ currNode = tree[tmp].insertEdg[s[idx] - 'a'];
+
+return;
+
+}
+
+
+ // creating new Node
+ ptr++;
+
+
+ // making new Node as child of X with
+ // weight as s[idx]
+ tree[tmp].insertEdg[s[idx] - 'a'] = ptr;
+
+
+ // calculating length of new Node
+ tree[ptr].length = tree[tmp].length + 2;
+
+
+ // updating end point for new Node
+ tree[ptr].end = idx;
+
+
+ // updating the start for new Node
+ tree[ptr].start = idx - tree[ptr].length + 1;
+
+
+
+//STEP 2//
+
+ /* Setting the suffix edge for the newly created
+ Node tree[ptr]. Finding some String Y such that
+ s[idx] + Y + s[idx] is longest possible
+ palindromic suffix for newly created Node. */
+
+tmp = tree[tmp].suffixEdg;
+
+
+ // making new Node as current Node
+ currNode = ptr;
+
+if (tree[currNode].length == 1)
+
+ {
+
+ // if new palindrome's length is 1
+ // making its suffix link to be null string
+ tree[currNode].suffixEdg = 2;
+
+return;
+
+}
+
+while (true)
+
+ {
+
+int curLength = tree[tmp].length;
+
+if (idx - curLength >= 1 and s[idx] == s[idx - curLength - 1])
+
+break;
+
+tmp = tree[tmp].suffixEdg;
+
+}
+
+
+ // Now we have found string Y
+ // linking current Nodes suffix link with s[idx]+Y+s[idx]
+ tree[currNode].suffixEdg = tree[tmp].insertEdg[s[idx] - 'a'];
+
+}
+
+
+
+// driver program
+ int
+main ()
+{
+
+ // initializing the tree
+ root1.length = -1;
+
+root1.suffixEdg = 1;
+
+root2.length = 0;
+
+root2.suffixEdg = 1;
+
+
+tree[1] = root1;
+
+tree[2] = root2;
+
+ptr = 2;
+
+currNode = 1;
+
+
+ // given string
+ s = "challenge";
+
+int l = s.length ();
+
+
+for (int i = 0; i < l; i++)
+
+insert (i);
+
+
+ // printing all of its distinct palindromic
+ // substring
+ cout << "All distinct palindromic substring for "
+ <<s << " : \n";
+
+for (int i = 3; i <= ptr; i++)
+
+ {
+
+cout << i - 2 << ") ";
+
+for (int j = tree[i].start; j <= tree[i].end; j++)
+
+cout << s[j];
+
+cout << endl;
+
+}
+
+return 0;
+
+}
diff --git a/challenge-145/khalid/perl/ch-1.pl b/challenge-145/khalid/perl/ch-1.pl
new file mode 100644
index 0000000000..4ce825ed60
--- /dev/null
+++ b/challenge-145/khalid/perl/ch-1.pl
@@ -0,0 +1,13 @@
+sub dotprod
+{
+ my($vec_a, $vec_b) = @_;
+ die "Vector size must be same \n" unless @$vec_a == @$vec_b;
+ my $sum = 0;
+ $sum += $vec_a->[$_] * $vec_b->[$_] for 0..$#$vec_a;
+ return $sum;
+}
+
+my @vec_a = (1,2,3);
+my @vec_b = (4,5,6);
+
+print dotprod(\@vec_a,\@vec_b), "\n"; \ No newline at end of file