
#include <stdio.h>
#include <strings.h>

#define NO	0
#define YES	!NO

#define STRING(len)	((char *) malloc(len + 1))

#define BADARGS	1

int colors, length;

main(argc,argv)
int argc;
char *argv[];
{
char *seq, *last;
void strinc(), stuff();
int i, apchk();

if (argc < 2)
  {
  fprintf(stderr,"Usage: %s length [colors]\n",argv[0]);
  exit(BADARGS);
  }
else if (argc > 2)
  colors = atoi(argv[2]);
else
  colors = 2;

length = atoi(argv[1]);

seq = STRING(length);
last = STRING(length);
stuff(seq,'A');
stuff(last,'A' - 1 + colors);

for (i=0; i<colors; i++)
  last[i] = 'A' + i;

for (; strcmp(seq,last); strinc(seq))
  if (!apchk(seq))
    printf("%s\n",seq);

if (!apchk(seq))
  printf("%s\n",seq);
}

void
stuff(s,fil)
char *s, fil;
{
int i;

for (i=0; i<length; i++)
  s[i] = fil;
s[length] = '\0';
}

void
strinc(s)
char *s;
{
int i;

for (i= length - 1; i>=0; i--)
  {
  if (s[i] != 'A' - 1 + colors)
    {
    s[i]++;
    return;
    }
  s[i] = 'A';
  }
return;
}

int
apchk(q)
char *q;
{
int f, s, t;

for (f=0; f <= length - 3; f++)
  for (s=f+1; s <= length - 2; s++)
    {
    t = s+s-f;
    if (t >= length) break;
    if ((q[f] == q[s]) && (q[s] == q[t])) return YES;
    }
return NO;
}
