Skip to content

Commit d8ff5db

Browse files
committed
misc
1 parent a45481c commit d8ff5db

11 files changed

+263
-7
lines changed

binary-tree-maximum-path-sum.nim

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
type
2+
TreeNode {.importc: "struct TreeNode".} = object
3+
val: cint
4+
left, right: ptr TreeNode
5+
6+
proc maxPathSum(root: ptr TreeNode): int {.exportc.} =
7+
var res: int = root.val
8+
proc dfs(x: ptr TreeNode): int =
9+
if x == nil: return 0
10+
let l = max(dfs(x.left), 0)
11+
let r = max(dfs(x.right), 0)
12+
res = max(res, l+x.val+r)
13+
max(l, r)+x.val
14+
15+
discard dfs(root)
16+
res

check-if-an-original-string-exists-given-two-encoded-strings.cc

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
// Check if an Original String Exists Given Two Encoded Strings
2-
const int P = 200003;
3-
struct HNode {int key; bool val; HNode *next; } pool[P], *head[P], *pit;
2+
const int P = 32768;
3+
struct HNode {int key; bool val; HNode *next; } pool[P*2], *head[P], *allo;
44

55
class Solution {
66
static const int BASE = 999*10;
77
string s1, s2;
8-
unordered_map<unsigned, char> memo;
98
bool f(int i, int j, int p) {
109
int key = ((p+BASE)*41+i)*41+j, hash = key%P;
1110
for (HNode *x = head[hash]; x; x = x->next)
@@ -36,16 +35,16 @@ class Solution {
3635
} else if (s1[i] == s2[j])
3736
ret = f(i+1, j+1, p);
3837
}
39-
HNode *x = pit == end(pool) ? new HNode : pit++;
38+
HNode *x = allo == end(pool) ? new HNode : allo++;
4039
*x = {key, ret, head[hash]};
4140
head[hash] = x;
4241
return ret;
4342
}
4443
public:
4544
bool possiblyEquals(string s1, string s2) {
46-
this->s1 = s1;
47-
this->s2 = s2;
48-
pit = pool;
45+
this->s1 = move(s1);
46+
this->s2 = move(s2);
47+
allo = pool;
4948
fill_n(head, sizeof(head)/sizeof(*head), nullptr);
5049
return f(0, 0, 0);
5150
}

course-schedule-ii.nim

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
type cintArray = ptr UncheckedArray[cint]
2+
3+
proc malloc(size: csize_t): pointer {.importc.}
4+
5+
proc findOrder(n: int, prereq: ptr UncheckedArray[cintArray], m: int, unused: pointer, returnSize: ptr cint): cintArray {.exportc.} =
6+
var
7+
d = newSeq[int](n)
8+
e = newSeq[seq[int]](n)
9+
fore = 0
10+
rear = 0
11+
result = cast[cintArray](malloc(cast[csize_t](cint.sizeof * n)))
12+
for x in toOpenArray(prereq, 0, m-1):
13+
inc d[x[0]]
14+
e[x[1]].add x[0]
15+
for i in 0..<n:
16+
if d[i] == 0:
17+
result[rear] = cast[cint](i)
18+
inc rear
19+
while fore < rear:
20+
let x: int = result[fore]
21+
inc fore
22+
for y in e[x]:
23+
dec d[y]
24+
if d[y] == 0:
25+
result[rear] = cast[cint](y)
26+
inc rear
27+
returnSize[] = if fore == n: cast[cint](n) else: 0

course-schedule.nim

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
type cintArray = ptr UncheckedArray[cint]
2+
3+
proc canFinish(n: int, prerequisites: ptr UncheckedArray[cintArray], m: int, unused: pointer): bool {.exportc.} =
4+
var
5+
d = newSeq[int](n)
6+
e = newSeq[seq[int]](n)
7+
top = -1
8+
num = 0
9+
for x in toOpenArray(prerequisites, 0, m-1):
10+
inc d[x[0]]
11+
e[x[1]].add x[0]
12+
for i in 0..<n:
13+
if d[i] == 0:
14+
d[i] = top
15+
top = i
16+
while top >= 0:
17+
let x = top
18+
top = d[top]
19+
inc num
20+
for y in e[x]:
21+
dec d[y]
22+
if d[y] == 0:
23+
d[y] = top
24+
top = y
25+
return num == n

diameter-of-binary-tree.nim

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Diameter of Binary Tree
2+
type
3+
TreeNode {.importc: "struct TreeNode".} = object
4+
val: cint
5+
left, right: ptr TreeNode
6+
7+
proc diameterOfBinaryTree(root: ptr TreeNode): int {.exportc.} =
8+
var res = 0
9+
proc height(x: ptr TreeNode): int =
10+
if x != nil:
11+
let l = height(x.left)
12+
let r = height(x.right)
13+
res = max(res, l+r)
14+
result = max(l, r) + 1
15+
discard height root
16+
res

maximum-earnings-from-taxi.nim

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Maximum Earnings From Taxi
2+
import std/algorithm
3+
4+
type cintA = ptr UncheckedArray[cint]
5+
6+
proc maxTaxiEarnings(n: int, rides: ptr UncheckedArray[cintA], m: int, u: pointer): int {.exportc.} =
7+
var
8+
a = newSeq[(cint,cint,cint)](m)
9+
dp = newSeq[int](n+1)
10+
j = 0
11+
for i in 0..<m:
12+
a[i] = (rides[i][0], rides[i][1], rides[i][1]-rides[i][0]+rides[i][2])
13+
a.sort proc (x, y: (cint,cint,cint)): int = x[1]-y[1]
14+
for i in 1..n:
15+
var t = dp[i-1]
16+
while j < m and a[j][1] == i:
17+
t = t.max dp[a[j][0]]+a[j][2]
18+
inc j
19+
dp[i] = t
20+
dp[n]

maximum-profit-in-job-scheduling.nim

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import std/algorithm
2+
3+
type cintA = ptr UncheckedArray[cint]
4+
5+
proc jobScheduling(startTime: cintA, n: int, endTime: cintA, u0: cint, profit: cintA, u1: cint): cint {.exportc.} =
6+
var
7+
a = newSeq[(cint, cint, cint)](n)
8+
dp = newSeq[cint](n)
9+
for i in 0..<n:
10+
a[i] = (startTime[i], endTime[i], profit[i])
11+
a.sort proc (x, y: (cint, cint, cint)): int = x[1] - y[1]
12+
dp[0] = a[0][2]
13+
for i in 1..<n:
14+
var l = 0
15+
var h = i
16+
while l < h:
17+
let m = (l+h) shr 1
18+
if a[m][1] <= a[i][0]: l = m+1
19+
else: h = m
20+
dp[i] = dp[i-1].max a[i][2] + (if l>0: dp[l-1] else: 0)
21+
dp[n-1]

parallel-courses-iii.nim

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Parallel Courses III
2+
import sequtils
3+
4+
type cintArray = ptr UncheckedArray[cint]
5+
6+
proc minimumTime(n: int, rels: ptr UncheckedArray[cintArray], m: int, unused: pointer, time: cintArray, unused1: cint): int {.exportc.} =
7+
var
8+
d = newSeq[int](n)
9+
e = newSeq[seq[int]](n)
10+
fin = newSeq[int](n)
11+
top = -1
12+
for x in toOpenArray(rels, 0, m-1):
13+
inc d[x[1]-1]
14+
e[x[0]-1].add x[1]-1
15+
for i in 0..<n:
16+
if d[i] == 0:
17+
d[i] = top
18+
top = i
19+
while top >= 0:
20+
let x = top
21+
top = d[top]
22+
fin[x] += time[x]
23+
for y in e[x]:
24+
fin[y] = max(fin[y], fin[x])
25+
dec d[y]
26+
if d[y] == 0:
27+
d[y] = top
28+
top = y
29+
fin[maxIndex(fin)]

plates-between-candles.nim

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Plates Between Candles
2+
import sequtils
3+
4+
type cintA = ptr UncheckedArray[cint]
5+
proc malloc(size: csize_t): pointer {.importc.}
6+
7+
proc platesBetweenCandles(s: cstring, q: ptr UncheckedArray[cintA], m: int, unused: pointer, returnSize: ptr cint): cintA {.exportc.} =
8+
let n = s.len
9+
var
10+
pref = newSeq[int](n+1)
11+
l = newSeqWith[int](n, -1)
12+
r = newSeqWith[int](n, n)
13+
c = 0
14+
j = 0
15+
for i in 0..<n:
16+
if s[i] == '*':
17+
inc c
18+
else:
19+
while j <= i:
20+
r[j] = i
21+
inc j
22+
pref[i] = c
23+
j = n-1
24+
for i in countdown(n-1, 0):
25+
if s[i] != '*':
26+
while i <= j:
27+
l[j] = i
28+
dec j
29+
result = cast[cintA](malloc(cast[csize_t](cint.sizeof * m)))
30+
returnSize[] = cast[cint](m)
31+
for i in 0..<m:
32+
let
33+
x = r[q[i][0]]
34+
y = l[q[i][1]]
35+
result[i] = if x >= y: 0 else: pref[y]-pref[x]
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Second Minimum Time to Reach Destination
2+
import std/sequtils
3+
4+
type cintArray = ptr UncheckedArray[cint]
5+
6+
proc secondMinimum(n: int, edges: ptr UncheckedArray[cintArray], edgesSize: int, _: cintArray, time: int, change: int): int {.exportc.} =
7+
var
8+
adj = newSeq[seq[cint]](n)
9+
d = newSeqWith[int](n, n)
10+
q = @[n-1]
11+
qi = 0
12+
for i in 0..<edgesSize:
13+
let
14+
u = edges[i][0]-1
15+
v = edges[i][1]-1
16+
adj[u].add v
17+
adj[v].add u
18+
19+
d[n-1] = 0
20+
while qi < q.len:
21+
let u = q[qi]
22+
inc qi
23+
for v in adj[u]:
24+
if d[v] == n:
25+
d[v] = d[u]+1
26+
q.add v
27+
28+
var length = d[0]+2 # A path of length d[0]+2 always exists
29+
q.setLen 1
30+
q[0] = 0
31+
qi = 0
32+
while qi < q.len:
33+
let u = q[qi]
34+
inc qi
35+
for v in adj[u]:
36+
if d[v] == d[u]:
37+
dec length
38+
qi = q.len
39+
break
40+
elif d[v] == d[u]-1:
41+
q.add v
42+
43+
for i in 0..<length:
44+
let t = result div change
45+
if t mod 2 == 1:
46+
result = (t+1) * change
47+
result += time

two-best-non-overlapping-events.nim

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Two Best Non-Overlapping Events
2+
import std/algorithm
3+
4+
type cintA = ptr UncheckedArray[cint]
5+
6+
proc maxTwoEvents(ev: ptr UncheckedArray[cintA], n: int, unused: pointer): cint {.exportc.} =
7+
var
8+
a = newSeq[(cint,cint)](n)
9+
b = newSeq[(cint,cint)](n)
10+
mx: cint = 0
11+
j = 0
12+
for i in 0..<n:
13+
a[i] = (ev[i][1], ev[i][2])
14+
b[i] = (ev[i][0], ev[i][2])
15+
sort a
16+
sort b
17+
for i in 0..<n:
18+
while j < n and a[j][0] < b[i][0]:
19+
mx = mx.max a[j][1]
20+
inc j
21+
result = result.max mx+b[i][1]

0 commit comments

Comments
 (0)