<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Vibe Engines — Algorithms &amp; DSA</title>
    <link>https://vibeengines.com/topic/algorithms-dsa</link>
    <atom:link href="https://vibeengines.com/topic/algorithms-dsa/feed.xml" rel="self" type="application/rss+xml" />
    <description>Data structures and algorithms taught as playable games and runnable challenges — graphs, sorting, search and dynamic programming, the half of every interview loop you can practice.</description>
    <language>en</language>
    <lastBuildDate>Mon, 03 Aug 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>How Programming Languages Actually Work</title>
      <link>https://vibeengines.com/handbook/how-programming-languages-work</link>
      <guid isPermaLink="true">https://vibeengines.com/handbook/how-programming-languages-work</guid>
      <category>Handbook</category>
      <description>Four questions of timing: when your code gets translated, when type errors get caught, what actually gets copied on a call, and what a stack frame costs. Compiled vs interpreted, static vs dynamic typing, pass by value vs reference, and recursion vs iteration — with the bug each one causes in real code.</description>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Greedy vs Dynamic Programming: When Is Greedy Safe?</title>
      <link>https://vibeengines.com/algorithm/greedy-vs-dp</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/greedy-vs-dp</guid>
      <category>Algorithm</category>
      <description>Don't guess which technique a problem needs — play both. Fill a 6-unit track from coins {1, 3, 4}: greedy grabs the 4, then needs two 1s, and finishes in 3 coins. The DP table finds 3 + 3 and finishes in 2. Same problem, and greedy is provably wrong. Then swap the coin set and watch greedy become optimal again — because the lesson isn't the counterexample, it's the condition. Three acts: play greedy, watch the table fill, then break it and fix it.</description>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Repair the Spread Traversal</title>
      <link>https://vibeengines.com/challenge/infection-spread-repair</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/infection-spread-repair</guid>
      <category>Challenge</category>
      <description>Inherited code computes how far something spreads through a contact graph, and the answers are wrong in a way that is invisible on small inputs. A one-way adjacency map, a frontier with no dedupe, and a seen-set updated one step too late. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Union-Find (Connected Components)</title>
      <link>https://vibeengines.com/challenge/union-find</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/union-find</guid>
      <category>Challenge</category>
      <description>The disjoint-set behind Kruskal’s MST and network connectivity: answer &quot;are these connected?&quot; in near-constant time with union by rank and path compression, then count the components. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Min Stack</title>
      <link>https://vibeengines.com/challenge/min-stack</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/min-stack</guid>
      <category>Challenge</category>
      <description>A stack that also returns its minimum in O(1) — no scanning. Carry the running minimum alongside each element. Replay push/pop/top/getMin operations. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>LFU Cache</title>
      <link>https://vibeengines.com/challenge/lfu-cache</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/lfu-cache</guid>
      <category>Challenge</category>
      <description>The cache that evicts what you use least often — and, on ties, least recently. Harder than LRU: track frequency and recency together, still O(1) per op. Replay get/put operations. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Implement a Trie</title>
      <link>https://vibeengines.com/challenge/implement-trie</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/implement-trie</guid>
      <category>Challenge</category>
      <description>The prefix tree behind autocomplete and spell-check: insert, search, and startsWith in time proportional to word length. Replay the operations on a tree keyed by characters. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>KMP Failure Table</title>
      <link>https://vibeengines.com/challenge/kmp-failure-table</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/kmp-failure-table</guid>
      <category>Challenge</category>
      <description>The precomputation that makes KMP string search run in O(n): for every prefix, the longest proper prefix that is also a suffix. Get it right and matching never backtracks. Build it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Longest Common Subsequence</title>
      <link>https://vibeengines.com/challenge/lcs-diff</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/lcs-diff</guid>
      <category>Challenge</category>
      <description>The DP behind &quot;git diff&quot; and DNA alignment: the longest subsequence common to two strings (order kept, gaps allowed). A classic 2-D table in O(m·n). Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Mini Regex Matcher (. and *)</title>
      <link>https://vibeengines.com/challenge/mini-regex-matcher</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/mini-regex-matcher</guid>
      <category>Challenge</category>
      <description>Implement regex matching with &quot;.&quot; and &quot;*&quot; — the classic hard interview problem. The subtlety: &quot;*&quot; can match nothing or many, so you must explore both. Solve it with DP in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Expression Calculator</title>
      <link>https://vibeengines.com/challenge/expression-calculator</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/expression-calculator</guid>
      <category>Challenge</category>
      <description>Evaluate an arithmetic string with precedence and parentheses, the way an interpreter does. A tiny recursive-descent parser handles precedence naturally. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>JSON Parser (Recursive Descent)</title>
      <link>https://vibeengines.com/challenge/json-parser</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/json-parser</guid>
      <category>Challenge</category>
      <description>Write the parser behind every API and config file: turn a JSON string into native objects, arrays, numbers, strings, booleans and null — by hand, without the built-in parser. Recursive descent mirrors the grammar. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Dijkstra’s Shortest Paths</title>
      <link>https://vibeengines.com/challenge/dijkstra</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/dijkstra</guid>
      <category>Challenge</category>
      <description>The algorithm every routing table and map app leans on: single-source shortest paths with non-negative weights. Greedily settle the closest node, relax its edges, repeat. Return the distance to every node. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>A* Pathfinding on a Grid</title>
      <link>https://vibeengines.com/challenge/a-star-grid</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/a-star-grid</guid>
      <category>Challenge</category>
      <description>The pathfinder inside games and robots: A* expands nodes by &quot;cost so far + estimated cost to go&quot;, so the heuristic focuses the search toward the goal instead of spreading blindly. Return the shortest path length. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Course Schedule (Cycle Detection)</title>
      <link>https://vibeengines.com/challenge/course-schedule</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/course-schedule</guid>
      <category>Challenge</category>
      <description>Can you finish every course given its prerequisites? The classic &quot;is this dependency graph acyclic?&quot; check a build system runs. Detect a cycle with a topological sort. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Word Ladder</title>
      <link>https://vibeengines.com/challenge/word-ladder</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/word-ladder</guid>
      <category>Challenge</category>
      <description>Transform one word into another one letter at a time, every step a real word — a shortest path in a hidden graph, so a job for BFS. Return the shortest ladder length. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Matrix Exponentiation</title>
      <link>https://vibeengines.com/challenge/matrix-power</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/matrix-power</guid>
      <category>Challenge</category>
      <description>Raise a matrix to the n-th power in O(log n) multiplies instead of n — the trick that computes the billionth Fibonacci number almost instantly. Fast exponentiation, lifted from numbers to matrices. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Skip List Insert &amp; Search</title>
      <link>https://vibeengines.com/challenge/skiplist-insert</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/skiplist-insert</guid>
      <category>Challenge</category>
      <description>O(log n) search and insert from nothing but linked lists and express lanes — the structure behind Redis sorted sets. Here node heights are given, so it’s fully deterministic. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Reservoir Sampling</title>
      <link>https://vibeengines.com/challenge/reservoir-sample</link>
      <guid isPermaLink="true">https://vibeengines.com/challenge/reservoir-sample</guid>
      <category>Challenge</category>
      <description>Pick k items uniformly at random from a stream of unknown length — one pass, O(k) memory. Here the random draws are supplied, so the result is deterministic and testable. Solve it in Python or TypeScript, with hidden tests.</description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Consistent Hashing: The Ring</title>
      <link>https://vibeengines.com/algorithm/consistent-hashing</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/consistent-hashing</guid>
      <category>Algorithm</category>
      <description>Don't memorize consistent hashing — play the ring. Place servers and keys on a hash ring where each key belongs to the next server clockwise, add a node and watch only ~1/N of the keys move instead of nearly all (as hash % N would), then flip on virtual nodes to smooth a lopsided load. The sharding primitive behind caches, databases, and load balancers — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Bloom Filter: Maybe Yes, Never No</title>
      <link>https://vibeengines.com/algorithm/bloom-filter</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/bloom-filter</guid>
      <category>Algorithm</category>
      <description>Don't memorize the Bloom filter — play it. Add items by lighting k bits with k hashes, then query: all bits set means 'probably present', any bit unset means 'definitely absent'. Hunt down a live false positive and see why a Bloom filter can give a false yes but never a false no — the tiny, key-less probabilistic set behind caches, databases, and crawlers. Made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Count–Min Sketch: Counting in Tiny Space</title>
      <link>https://vibeengines.com/algorithm/count-min-sketch</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/count-min-sketch</guid>
      <category>Algorithm</category>
      <description>Don't memorize the Count–Min Sketch — play it. Count how often items appear in a stream using a fixed grid of counters and d hashes: bump one cell per row on each event, and estimate a frequency by taking the minimum across rows. Watch a collision inflate an estimate, and see why it can over-count but never under-count — the structure behind heavy-hitters and streaming analytics. Made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Fisher–Yates: The Fair Shuffle</title>
      <link>https://vibeengines.com/algorithm/fisher-yates</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/fisher-yates</guid>
      <category>Algorithm</category>
      <description>Don't memorize the Fisher–Yates shuffle — play it. Walk the array from the back, swap each element with a random one from the unshuffled front, and watch a provably uniform permutation build in O(n). Then see why the tempting naive shuffle (swap each slot with any random index) is silently biased. The one correct way to shuffle — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Radix Sort: Sorting Without Comparing</title>
      <link>https://vibeengines.com/algorithm/radix-sort</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/radix-sort</guid>
      <category>Algorithm</category>
      <description>Don't memorize radix sort — play it. Sort numbers by distributing them into 10 buckets by their last digit, gather, then repeat for each higher digit — with zero comparisons. Watch a stable pass per digit sort n numbers in O(n·d), and see why the passes must run least-significant digit first. Made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Bidirectional BFS: Meet in the Middle</title>
      <link>https://vibeengines.com/algorithm/bidirectional-bfs</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/bidirectional-bfs</guid>
      <category>Algorithm</category>
      <description>Don't memorize bidirectional BFS — play it. Run two breadth-first searches at once, one forward from the start and one backward from the goal, and stop the instant their frontiers touch. Watch two small explored regions meet in the middle instead of one huge one, cutting explored nodes from roughly b^d toward 2·b^(d/2). Made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Morris Traversal: Threading the Tree</title>
      <link>https://vibeengines.com/algorithm/morris-traversal</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/morris-traversal</guid>
      <category>Algorithm</category>
      <description>Don't memorize Morris traversal — play it. Walk a binary tree in sorted order using O(1) extra space by temporarily threading each node's inorder predecessor back to it, then undoing the thread on the way back — no stack, no recursion. Watch the threads appear and vanish as the tree is traversed in place and left exactly as it started. Made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>LSM-Tree: Write Fast, Merge Later</title>
      <link>https://vibeengines.com/algorithm/lsm-tree</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/lsm-tree</guid>
      <category>Algorithm</category>
      <description>Don't memorize the LSM-tree — play it. Writes land instantly in an in-memory memtable; when it fills, it flushes to an immutable sorted file (SSTable) on disk. Reads check the memtable then the SSTables newest-first, and compaction merges files while dropping shadowed old versions. The write-optimized engine behind RocksDB, Cassandra, and LevelDB — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Convex Hull: Wrapping the Points</title>
      <link>https://vibeengines.com/algorithm/convex-hull</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/convex-hull</guid>
      <category>Algorithm</category>
      <description>Don't memorize the convex hull — play it. Sort points left to right, then sweep once building a lower chain and once building an upper chain, popping any point that makes a non-left turn — the cross product decides every turn. Andrew's monotone chain finds the tightest enclosing polygon in O(n log n). Made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>External Merge Sort: Bigger Than Memory</title>
      <link>https://vibeengines.com/algorithm/external-merge-sort</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/external-merge-sort</guid>
      <category>Algorithm</category>
      <description>Don't memorize external merge sort — play it. When the data is too big for RAM, sort it in two phases: read chunks that fit in memory, sort each and write it back as a sorted run, then k-way merge all the runs by repeatedly emitting the smallest current head. The disk-based sort behind databases and big-data engines — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Eulerian Path: Every Edge, Once</title>
      <link>https://vibeengines.com/algorithm/euler-path</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/euler-path</guid>
      <category>Algorithm</category>
      <description>Don't memorize Hierholzer's algorithm — play it. An Eulerian path uses every edge of a graph exactly once, and exists only when 0 or 2 vertices have odd degree. Hierholzer builds it in O(E): walk unused edges until stuck, then splice in side-loops from any vertex with edges left. Watch the trail form and the degree rule decide whether it can — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>MinHash: Similarity in a Signature</title>
      <link>https://vibeengines.com/algorithm/minhash</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/minhash</guid>
      <category>Algorithm</category>
      <description>Don't memorize MinHash — play it. Estimate the Jaccard similarity of two sets by comparing k tiny hash-based signatures: for each hash, the minimum value over a set's elements matches between two sets with probability equal to their Jaccard similarity. Add hash functions and watch the estimate converge on the true overlap. The trick behind near-duplicate detection at web scale — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Line Sweep: Sliding the Line</title>
      <link>https://vibeengines.com/algorithm/line-sweep</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/line-sweep</guid>
      <category>Algorithm</category>
      <description>Don't memorize the line sweep — play it. Slide an imaginary line across the input and handle a sorted list of events as it passes: +1 when an interval starts, −1 when it ends. A running counter reveals the maximum overlap (the 'meeting rooms' answer) in O(n log n). The sweep-line technique behind interval, overlap, and computational-geometry problems — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Miller–Rabin: Probably Prime</title>
      <link>https://vibeengines.com/algorithm/miller-rabin</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/miller-rabin</guid>
      <category>Algorithm</category>
      <description>Don't memorize Miller–Rabin — play it. Test whether a huge number is prime without factoring it: pick bases and check a chain of modular squares. A single failing base proves the number composite with certainty; passing k bases makes it prime with error at most 4⁻ᵏ. Watch a Carmichael number get caught and a pseudoprime fool the first bases before it's exposed — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Karatsuba: Three, Not Four</title>
      <link>https://vibeengines.com/algorithm/karatsuba</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/karatsuba</guid>
      <category>Algorithm</category>
      <description>Don't memorize Karatsuba — play it. Split two numbers in half and the schoolbook method needs four sub-multiplications; Karatsuba computes the same product with only three, using one clever combination. Recursing that trick drops multiplication from O(n²) to about O(n^1.585). Watch the three products form and combine — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Tree DP: Answers Flow Up</title>
      <link>https://vibeengines.com/algorithm/tree-dp</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/tree-dp</guid>
      <category>Algorithm</category>
      <description>Don't memorize tree DP — play it. Solve problems on a tree by computing each node's answer from its children in one post-order pass. Here: the maximum-weight independent set — pick nodes with the largest total weight, no two adjacent — by keeping two values per node (best if you take it, best if you don't). Watch the values flow up from the leaves and the optimal set light up — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Bridges &amp; Articulation Points: The Weak Links</title>
      <link>https://vibeengines.com/algorithm/bridges-articulation</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/bridges-articulation</guid>
      <category>Algorithm</category>
      <description>Don't memorize Tarjan's bridge-finding — play it. A bridge is an edge whose removal disconnects the graph; an articulation point is such a vertex. One DFS, tracking each node's discovery time and the earliest ancestor its subtree can reach (its low-link), finds them all in O(V+E). Watch the DFS assign disc and low values and the critical edges light up — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Simulated Annealing: Cool to Improve</title>
      <link>https://vibeengines.com/algorithm/simulated-annealing</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/simulated-annealing</guid>
      <category>Algorithm</category>
      <description>Don't memorize simulated annealing — play it. Optimize a hard problem (a traveling-salesman tour) by proposing small random changes: always accept improvements, but sometimes accept a worse move too — with a probability that shrinks as a 'temperature' cools. Early heat escapes local minima; late cooling settles into a great solution. Watch the tour untangle as the temperature drops — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Extended Euclidean &amp; CRT: gcd, and a Bonus</title>
      <link>https://vibeengines.com/algorithm/extended-euclid</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/extended-euclid</guid>
      <category>Algorithm</category>
      <description>Don't memorize the extended Euclidean algorithm — play it. It finds gcd(a,b) and, for free, the integers x and y with a·x + b·y = gcd — the Bézout coefficients that give modular inverses and power the Chinese Remainder Theorem. Watch the coefficient table build row by row and the identity a·x + b·y = gcd hold at every step — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Pollard's Rho: Factor by Collision</title>
      <link>https://vibeengines.com/algorithm/pollard-rho</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/pollard-rho</guid>
      <category>Algorithm</category>
      <description>Don't memorize Pollard's rho — play it. Factor a composite number without trial division by iterating a pseudo-random function mod n until two runners collide, then taking a gcd to reveal a factor. The sequence loops into a ρ shape — a tail leading into a cycle — which is where the algorithm gets its name. Watch the tortoise and hare meet and a factor pop out — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Sqrt Decomposition: Blocks of Root-N</title>
      <link>https://vibeengines.com/algorithm/sqrt-decomposition</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/sqrt-decomposition</guid>
      <category>Algorithm</category>
      <description>Don't memorize sqrt decomposition — play it. Split an array into blocks of size √n and precompute each block's answer. A range query then touches only a few whole blocks plus the partial ends — O(√n) instead of O(n) — and a point update fixes one element and its block. The simplest fast-range-query structure — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Lazy Segment Tree: Update Lazily</title>
      <link>https://vibeengines.com/algorithm/segment-tree-lazy</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/segment-tree-lazy</guid>
      <category>Algorithm</category>
      <description>Don't memorize lazy propagation — play it. A segment tree answers range queries in O(log n), but a range update that hits every leaf would be O(n). Lazy propagation fixes that: mark a handful of covering nodes with a pending 'lazy' tag and push it down to children only when a later query actually needs it. Watch a range-add tag O(log n) nodes instead of touching every leaf — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Bitmask DP: Sets as Integers</title>
      <link>https://vibeengines.com/algorithm/bitmask-dp</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/bitmask-dp</guid>
      <category>Algorithm</category>
      <description>Don't memorize bitmask DP — play it. Encode a set of visited items as the bits of an integer, and dynamic-program over (subset, position) states. On the traveling salesman problem this is the Held–Karp algorithm: O(2ⁿ·n²) instead of O(n!) — turning an intractable factorial search into an exponential one that's vastly smaller for real n. Watch subsets fill in as binary masks and the optimal tour emerge — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Interval Tree: What Contains This?</title>
      <link>https://vibeengines.com/algorithm/interval-tree</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/interval-tree</guid>
      <category>Algorithm</category>
      <description>Don't memorize the interval tree — play it. Store intervals in a BST keyed by their low endpoint and augment each node with the maximum endpoint in its subtree. A 'stabbing' query — which intervals contain point q — then prunes whole subtrees using that max, answering in O(log n + k) instead of scanning them all. Watch the search skip subtrees that can't possibly overlap — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Suffix Array: Suffixes, Sorted</title>
      <link>https://vibeengines.com/algorithm/suffix-array</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/suffix-array</guid>
      <category>Algorithm</category>
      <description>Don't memorize the suffix array — play it. Sort all suffixes of a string and store their starting positions; the result powers fast substring search, longest-repeated-substring, and more, in a fraction of a suffix tree's memory. Add the LCP array — the shared prefix between neighbours — and you unlock even more. Watch the suffixes sort and the shared prefixes light up — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Digit DP: Count by Digits</title>
      <link>https://vibeengines.com/algorithm/digit-dp</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/digit-dp</guid>
      <category>Algorithm</category>
      <description>Don't memorize digit DP — play it. Count how many numbers from 0 to N satisfy a digit property (like a target digit sum) without checking each one. Build them digit by digit, tracking a 'tight' flag that says whether the prefix still hugs N's own digits. Watch the count assemble position by position instead of looping to a billion — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Treap: Balance by Chance</title>
      <link>https://vibeengines.com/algorithm/treap</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/treap</guid>
      <category>Algorithm</category>
      <description>Don't memorize the treap — play it. It's a binary search tree and a heap at once: each node has a key (BST-ordered) and a random priority (heap-ordered). Since the shape is decided by random priorities, not insertion order, the tree stays balanced in expectation with no complicated rebalancing rules — just rotations. Watch keys insert and rotate into a balanced tree — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Splay Tree: Touch It, Lift It</title>
      <link>https://vibeengines.com/algorithm/splay-tree</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/splay-tree</guid>
      <category>Algorithm</category>
      <description>Don't memorize the splay tree — play it. Every time you touch a node, it rotates all the way up to the root — so recently and frequently accessed keys stay near the top and become cheap to reach again. No balance factors or colors, just splaying, with O(log n) amortized operations. Watch each access reshape the tree and pull the key to the root — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Mo's Algorithm: Reorder to Win</title>
      <link>https://vibeengines.com/algorithm/mos-algorithm</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/mos-algorithm</guid>
      <category>Algorithm</category>
      <description>Don't memorize Mo's algorithm — play it. Given many offline range queries, answer them by keeping one running window and sliding its two ends with cheap add/remove steps. The trick is the order: sort queries by their left endpoint's √n block, and total pointer movement collapses from O(q·n) to O((n+q)·√n). Watch reordering shrink the work — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Timsort: Sort What's Already There</title>
      <link>https://vibeengines.com/algorithm/timsort</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/timsort</guid>
      <category>Algorithm</category>
      <description>Don't memorize Timsort — play it. The default sort in Python and Java finds the natural sorted 'runs' already present in real data, extends short ones with insertion sort, then merges the runs with a smart stack — so nearly-sorted input sorts in nearly O(n). Watch the runs get detected and merged into a fully sorted array — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Min-Cost Max-Flow: Cheapest Flow First</title>
      <link>https://vibeengines.com/algorithm/min-cost-max-flow</link>
      <guid isPermaLink="true">https://vibeengines.com/algorithm/min-cost-max-flow</guid>
      <category>Algorithm</category>
      <description>Don't memorize min-cost max-flow — play it. Every edge has a capacity and a per-unit cost; you want the maximum flow from source to sink at the least total cost. The method: repeatedly find the cheapest augmenting path (a shortest path by cost in the residual graph) and push flow along it. Watch flow accumulate along the cheapest routes first — made playable, with theory and a quiz.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>
