// Run as ./a.out 4
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

void initAlphabet(char alphabet[], int n, int i) {
	if (i == n) {
		*alphabet = '\0';
		return;
	}
	*alphabet = 'a' + i;
	initAlphabet(alphabet + 1, n, i + 1);
}
void printAlphabet(char alphabet[]) {
	if (*alphabet) {
		putchar(*alphabet);
		printAlphabet(alphabet + 1);
	} else
		putchar('\n');
}
void powerSet(char alphabet[], int *pii, int onestrlen, char onestr[]) {
	if (*alphabet == '\0') {
		onestr[onestrlen] = '\0';
		printf("%3d: %s\n", *pii, onestr);
		++*pii;
	} else {
		// do not include *alphabet and recurse
		powerSet(alphabet + 1, pii, onestrlen, onestr);
		// include *alphabet and recurse
		onestr[onestrlen] = *alphabet;
		powerSet(alphabet + 1, pii, onestrlen + 1, onestr);
	}
}
void printPowerSet(int n, char power[][n + 1], int pii) {
	if (pii >= 0) {
		puts(*power);
		printPowerSet(n, power + 1, pii - 1);
	}
}
int main(int a, char *b[]) {
	int n = atoi(b[1]);
	char alphabet[n];
	char onestr[n];
	//char power[1 << n][n + 1];	// +1 for \0

	initAlphabet(alphabet, n, 0);
	printf("Alphabet: ");
	printAlphabet(alphabet);

	int pii = 0;	// index of the string
	powerSet(alphabet, &pii, 0, onestr);
	// assert(pii == 2^n)
	printf("size of the powerset = %d\n", pii);
	//printPowerSet(n, power, (1 << n) - 1);

	return 0;
}
