#如果!定义的HAVE_SUBSET_LEX_H__#定义HAVE_SUBSET_LEX_H__//此文件是FXT库的一部分。//版权所有(C)2010、2012、2013、2014、2015、2019、2023 Joerg Arndt//许可证:GNU通用公共许可证版本3或更高版本,//请参阅主目录中的文件COPYING.txt。#包括“fxttypes.h”//如果已定义,则使用数组而不是指针://#define SUBSET_LEX_MAX_ARRAY_LEN 64//默认为关闭类subset_lex//子集{0,1,2,…,n-1}的非空子集。//表示为零件列表。//无回路生成。//参见Joerg Arndt,Subset-lex:我们错过订单了吗?,(2014)// http://arxiv.org/abs/1405.6503{公众:ulong n;//集合中的元素数,应具有n>=1ulong k_;//子集中最后一个元素的索引ulong n1_;//==n>=1时为n-1,n==0时为==0//子集中的元素数==k+1#如果!定义的SUBSET_LEX_MAX_ARRAY_LENulong*x_;//x[0…k-1]:{0,1,2,…,n-1}的子集#其他ulong x_[SUBSET_LEX_MAX_ARRAY_LEN];#结尾subset_lex(const subset_lex&)=删除;subset_lex&运算符=(const subset_lex&)=删除;公众:显式subset_lex(ulong n)//应具有n>=1,//对于n==0,生成一组元素零。{n=n;n1_=(n?n-1:0);#如果!定义的SUBSET_LEX_MAX_ARRAY_LENx_=新ulong[n+(n_==0)];#结尾first();}~subset_lex(){#如果!定义的SUBSET_LEX_MAX_ARRAY_LEN删除[]x_;#结尾}ulong first(){k_=0;x[0]=0;返回k+1;}ulong last(){k=0;x[0]=n1_;返回k+1;}ulong next()//生成下一个子集。//返回子集中的元素数。//如果电流是最后一个,则返回零。//无回路算法。{如果(x[k]==n1)//最后一个元素是max?{如果(k==0),则返回0;--k_;//删除最后一个元素x_[k_]+=1;//增加最后一个元素}else//从集合中添加下一个元素:{++k_;x_[k_]=x_[k_1]+1;}返回k+1;}ulong前()//生成上一个子集。//返回子集中的元素数。//如果电流第一,则返回零。//无回路算法。{如果(k==0)//只有一个元素?{如果(x[0]==0),则返回0;x_[0]-=1;//减量最后(也是唯一)元素++k_(k);x_[k_]=n1_;//附加最大元素}其他的{如果(x_[k_]==x_[k_-1]+1)--k_;//删除最后一个元素其他的{x_[k_]-=1;//减量最后一个元素++k_;x_[k_]=n1_;//附加最大元素}}返回k+1;}ulong num_parts()常量{return k+1;}constulong*data()const{return x_;}};// -------------------------//#undef SUBSET_LEX_MAX_ARRAY_LEN//最好留在#endif//!定义的HAVE_SUBSET_LEX_H__