#!perl use warnings; use strict; use IO::Handle; use Time::HiRes "time"; sub aeq { my($a, $b) = @_; @$a == @$b or die; for (0 .. @$a - 1) { $$a[$_] == $$b[$_] or return; } return 1; } my @poss; { my @pos = (0, 0, 0, 0, 0, 0, 0); while (1) { my $k = @pos; while (0 <= $k && 2 <= $pos[--$k]) { $pos[$k] = 0; } -1 == $k and last; $pos[$k]++; my @freq = (0)x3; $freq[$_]++ for @pos; aeq(\@freq, [2, 2, 3]) or next; push @poss, [@pos]; } } #warn 0+@poss; # 210 sub key { 0 + join "", map { ("10", "01", "00")[$_] } @_; } sub ckey { 7 == @_ or die; my $r = 0; for my $x (1 .. 6) { for my $y (0 .. $x - 1) { $r <<= 1; $r += $_[$x] == $_[$y]; } } 0 + $r; } my $INF = *DATA; my $num_inp = 0 + <$INF>; for (1 .. $num_inp) { my $begin_time = time; my @r0 = <$INF> =~ /[012]/g; my @r1 = <$INF> =~ /[012]/g; my $s2 = key(@r0) + key(@r1); my $cs2 = ckey(@r0) & ckey(@r1); my @posr = grep { !aeq(\@r0, $_) && !aeq(\@r1, $_) } @poss; @posr == @poss - 2 or do { print STDERR "i ", join(" ", @r0), "\n ", join(" ", @r1), "\n"; print STDERR "w 0\n"; print "0\n"; flush STDOUT; next; }; my @posk = map { key @$_ } @posr; my @posck = map { ckey @$_ } @posr; # most a feladat olyan az $m2 < $m3 < $m4 < $m5 < $m6 indexek összeszámolása, amelyekre # $posk[$mi] összege plusz $s2 egyenlő 222222_2222_2222, # és $posck[$mi] bitwise and-je and $cs2 egyenlő & 0. my %sx_lookup; for my $m5 (3 .. @posr - 2) { for my $m6 ($m5 + 1 .. @posr - 1) { my $sx = 222222_2222_2222 - $s2 - $posk[$m5] - $posk[$m6]; my $csx = $cs2 & $posck[$m5] & $posck[$m6]; push @{$sx_lookup{0 + $sx}}, [$m5, $m6, $csx]; } } my($T) = (0); print STDERR "i ", join(" ", @r0), "\n ", join(" ", @r1), "\n"; for my $m2 (0 .. @posr - 5) { for my $m3 ($m2 + 1 .. @posr - 4) { for my $m4 ($m3 + 1 .. @posr - 3) { my $sx = $posk[$m2] + $posk[$m3] + $posk[$m4]; my $csb = $posck[$m2] & $posck[$m3] & $posck[$m4]; for my $rec (@{$sx_lookup{0 + $sx}}) { my($m5, $m6, $csx) = @$rec; $m4 < $m5 or next; my $cs = $csb & $csx; 0 == $cs or next; $T++; } }} print STDERR "."; } my $R = $T * (5*4*3*2*1); print $R, "\n"; flush STDOUT; print STDERR "\no $T $R\n"; printf STDERR "t %.2f sec\n", time - $begin_time; } __DATA__ 10 2 1 0 0 2 2 1 0 2 2 1 1 0 2 2 0 0 2 2 1 1 2 0 1 2 2 1 0 2 1 0 1 2 0 2 2 2 1 1 2 0 0 2 1 0 1 2 2 0 1 2 0 2 1 2 0 0 2 0 1 2 1 2 1 2 0 2 1 0 2 2 0 0 1 2 2 1 2 1 1 0 2 2 0 1 2 2 0 0 2 1 2 0 1 0 1 2 2 2 2 1 1 0 2 0 1 0 2 1 2 0 2 2 0 1 1 2 0 2 0 1 2 2 0 1 2 0 2 2 0 1 2 1 1 0 1 2 2 2 0 #### 0 0 1 1 2 2 2 0 0 1 2 1 2 2 0 0 1 1 2 2 2 0 0 2 2 1 1 2 0 0 1 1 2 2 2 0 1 0 1 2 2 2 0 0 1 1 2 2 2 0 1 0 2 1 2 2 0 0 1 1 2 2 2 0 1 1 2 0 2 2 0 0 1 1 2 2 2 0 1 2 2 0 1 2 0 0 1 1 2 2 2 0 2 0 2 1 1 2 0 0 1 1 2 2 2 0 2 1 2 0 1 2 0 0 1 1 2 2 2 0 2 2 2 0 1 1 0 0 1 1 2 2 2 1 1 0 0 2 2 2 0 0 1 1 2 2 2 1 1 0 2 0 2 2 0 0 1 1 2 2 2 1 1 2 2 0 0 2 0 0 1 1 2 2 2 1 2 0 2 0 1 2 0 0 1 1 2 2 2 1 2 2 2 0 0 1