11use core:: str;
22
33use aoc_runner_derive:: aoc;
4+ use bitvec:: array:: BitArray ;
45
56const MAX : usize = 26 * 26 ;
67
@@ -67,11 +68,13 @@ pub fn part1(s: &str) -> u64 {
6768
6869static mut SCRATCH : [ u8 ; MAX_C * 3 ] = [ 0 ; MAX_C * 3 ] ;
6970
71+ const BAL : usize = ( MAX * MAX ) . div_ceil ( 64 ) ;
72+
7073#[ aoc( day23, part2) ]
7174pub fn part2 ( s : & str ) -> & ' static str {
7275 let s = s. as_bytes ( ) ;
7376
74- let mut g = [ [ false ; MAX ] ; MAX ] ;
77+ let mut g = BitArray :: < [ u64 ; BAL ] > :: default ( ) ;
7578
7679 let mut vertecies = const {
7780 let mut vs = [ ( 0u16 , 0 ) ; MAX ] ;
@@ -91,10 +94,8 @@ pub fn part2(s: &str) -> &'static str {
9194 let cp2 = ( s. get_unchecked ( i + 3 ) - b'a' ) as u16 * 26
9295 + ( s. get_unchecked ( i + 4 ) - b'a' ) as u16 ;
9396
94- * g. get_unchecked_mut ( cp2 as usize )
95- . get_unchecked_mut ( cp1 as usize ) = true ;
96- * g. get_unchecked_mut ( cp1 as usize )
97- . get_unchecked_mut ( cp2 as usize ) = true ;
97+ g. set ( cp2 as usize * MAX + cp1 as usize , true ) ;
98+ g. set ( cp1 as usize * MAX + cp2 as usize , true ) ;
9899 vertecies. get_unchecked_mut ( cp1 as usize ) . 1 += 1 ;
99100 vertecies. get_unchecked_mut ( cp2 as usize ) . 1 += 1 ;
100101
@@ -143,7 +144,7 @@ pub fn part2(s: &str) -> &'static str {
143144// Using this algorithm: https://web.archive.org/web/20160911054636/http://www.dcs.gla.ac.uk/~pat/jchoco/clique/indSetMachrahanish/papers/tomita2003.pdf
144145fn expand (
145146 mut r : & mut [ ( u16 , u16 ) ] ,
146- g : & [ [ bool ; MAX ] ; MAX ] ,
147+ g : & BitArray < [ u64 ; BAL ] > ,
147148 q : & mut heapless:: Vec < u16 , MAX_C > ,
148149 q_max : & mut heapless:: Vec < u16 , MAX_C > ,
149150 cs : & mut [ heapless:: Vec < u16 , MAX_C > ; MAX_C ] ,
@@ -155,7 +156,7 @@ fn expand(
155156
156157 let mut new_r = heapless:: Vec :: < ( u16 , u16 ) , MAX_C > :: new ( ) ;
157158 for ( i, _) in rest. iter ( ) {
158- if g[ p ] [ * i as usize ] {
159+ if g[ * i as usize * MAX + p ] {
159160 new_r. push ( ( * i, 0 ) ) . unwrap ( ) ;
160161 }
161162 }
@@ -176,7 +177,7 @@ fn expand(
176177
177178fn number_sort (
178179 r : & mut [ ( u16 , u16 ) ] ,
179- g : & [ [ bool ; MAX ] ; MAX ] ,
180+ g : & BitArray < [ u64 ; BAL ] > ,
180181 cs : & mut [ heapless:: Vec < u16 , MAX_C > ; MAX_C ] ,
181182) {
182183 let mut maxno = 0 ;
@@ -191,7 +192,7 @@ fn number_sort(
191192
192193 ' outer: loop {
193194 for i in & cs[ k] {
194- if g[ p ] [ * i as usize ] {
195+ if g[ * i as usize * MAX + p ] {
195196 k += 1 ;
196197 continue ' outer;
197198 }
0 commit comments