#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;
}