diff --git a/day11/src/main.rs b/day11/src/main.rs
index 5f19ef4..8c938e9 100644
--- a/day11/src/main.rs
+++ b/day11/src/main.rs
@@ -8,13 +8,13 @@ fn main() {
 }
 
 fn pt1(stones: &[u128]) -> usize {
-    blink2(stones, 25)
+    blink3(stones.to_vec(), 25)
 }
 
 fn pt2(stones: &[u128]) -> usize {
     let mut total = 0;
     for stone in stones {
-        total += blink2(&[*stone], 75);
+        total += blink3(vec![*stone], 75);
     }
     total
 }
@@ -56,6 +56,35 @@ fn blink2(stones: &[u128], blinks: usize) -> usize {
     stones.len()
 }
 
+fn blink3(mut stones: Vec<u128>, blinks: usize) -> usize {
+    let mut total = stones.len();
+    for blink in 0..blinks {
+        let mut rights = Vec::new();
+        for stone in stones.iter_mut() {
+            let digits = stone.to_string();
+            match stone {
+                0 => {
+                    *stone = 1;
+                }
+                _ if digits.len() % 2 == 0 => {
+                    let mid = digits.len() / 2;
+                    let left = digits[0..mid].parse().unwrap();
+                    let right = digits[mid..].parse().unwrap();
+                    *stone = left;
+                    rights.push(right);
+                    total += 1;
+                }
+                _ => {
+                    *stone *= 2024;
+                }
+            }
+        }
+        total += blink3(rights, blinks - blink);
+    }
+
+    total
+}
+
 fn parse(input: &str) -> Vec<u128> {
     input
         .trim()
@@ -77,6 +106,6 @@ mod test {
     #[test]
     fn p2() {
         let stones = parse("125 17");
-        assert_eq!(22, blink2(&stones, 6));
+        assert_eq!(55312, blink3(stones, 25));
     }
 }