@@ -243,8 +243,8 @@ unsafe fn inner_part2(s: &[u8]) -> u64 {
243243
244244 let mut states1_start = 1 ;
245245 let mut states2_start;
246- let mut states1_other_states = & mut heapless:: Vec :: < ( u16 , u64 ) , NFA_SIZE > :: new ( ) ;
247- let mut states2_other_states = & mut heapless:: Vec :: < ( u16 , u64 ) , NFA_SIZE > :: new ( ) ;
246+ let mut states1_other_states = heapless:: Vec :: < ( u16 , u64 ) , NFA_SIZE > :: new ( ) ;
247+ let mut states2_other_states = heapless:: Vec :: < ( u16 , u64 ) , NFA_SIZE > :: new ( ) ;
248248
249249 while i < s. len ( ) {
250250 if * s. get_unchecked ( i) == b'\n' {
@@ -280,10 +280,54 @@ unsafe fn inner_part2(s: &[u8]) -> u64 {
280280 states2_other_states. push_unchecked ( ( next. get_next ( ) , * amount) ) ;
281281 }
282282 }
283- std:: mem:: swap ( & mut states2_start, & mut states1_start) ;
284- std:: mem:: swap ( & mut states2_other_states, & mut states1_other_states) ;
285283
286- if states1_start == 0 && states1_other_states. is_empty ( ) {
284+ if states2_start == 0 && states2_other_states. is_empty ( ) {
285+ while i < s. len ( ) && * s. get_unchecked ( i) != b'\n' {
286+ i += 1 ;
287+ }
288+ } else {
289+ i += 1 ;
290+ }
291+
292+ if i >= s. len ( ) {
293+ break ;
294+ }
295+
296+ if * s. get_unchecked ( i) == b'\n' {
297+ sum += states2_start;
298+
299+ states1_other_states. clear ( ) ;
300+ states1_start = 1 ;
301+ i += 1 ;
302+ continue ;
303+ }
304+ let color = to_idx ( * s. get_unchecked ( i) ) ;
305+
306+ states1_other_states. clear ( ) ;
307+ states1_start = 0 ;
308+
309+ if states2_start > 0 {
310+ let next = nfa. get_unchecked ( 0 ) . get_unchecked ( color) ;
311+
312+ if next. has_start ( ) {
313+ states1_start += states2_start;
314+ }
315+ if next. get_next ( ) != 0 {
316+ states1_other_states. push_unchecked ( ( next. get_next ( ) , states2_start) ) ;
317+ }
318+ }
319+ for ( s, amount) in states2_other_states. iter ( ) {
320+ let next = nfa. get_unchecked ( * s as usize ) . get_unchecked ( color) ;
321+
322+ if next. has_start ( ) {
323+ states1_start += amount;
324+ }
325+ if next. get_next ( ) != 0 {
326+ states1_other_states. push_unchecked ( ( next. get_next ( ) , * amount) ) ;
327+ }
328+ }
329+
330+ if states2_start == 0 && states2_other_states. is_empty ( ) {
287331 while i < s. len ( ) && * s. get_unchecked ( i) != b'\n' {
288332 i += 1 ;
289333 }
0 commit comments