#include <iostream>
using namespace std;
const int N = 1000;
void SelSubstr(int flag[],int count)
{
for(int i = 0;i < count;i++)
{
flag[i] = flag[i]^1;
//当前元素取反后为0则停止。这样取反正好有2^n-1种情况,而且不重复。
if(!flag[i])
break;
}
}
void print(int flag[],int count,const char *str,char *subStr)
{
int j = 0;
for(int i = 0;i<count;i++)
{
if(flag[i]) //把要输出的字符放在subStr中
subStr[j++] = str[i];
}
subStr[j] = '/0';
cout<<subStr<<endl;
}
int main()
{
char *str = new char[N]; //原字串
char *subStr = new char[N]; //子集临时存放字串
cout<<"Input a string:";
cin.getline(str,N);
int count = strlen(str);
int *flag = new int[count];
//默认开始时,设置所有元素都没显示
for(int i = 0;i< count;i++)
flag[i] = 0;
cout<<"As follow is substr:"<<endl;
int subStrCount = 0; //统计子集的数目
int q = 2<<(count-1); //计算循环次数
for(int i = 0;i < q;i++)
{
SelSubstr(flag,count); //取子串(子集)
print(flag,count,str,subStr); //显示所取子串(子集)
subStrCount++;
}
cout<<"total number of the subset(include Empty-set)is: "<<subStrCount<<endl;
return 0;
}