#include "puzutl.h"

// 0 : ピ
// 1 : ョ
// 2 : ン

#define S 100
byte word[S];

cstring c2s[] = { "ピ", "ョ", "ン"}; // 出力用

YesNo samestr( int level, int i, int j) // word[i]からj文字分同じ文字列が出現したか調べる
{
  for( int k=0; k< j; k++) {
    if( i+j+k > level) return NO; // 単語の長さを越えて比較しようとしている
    if( word[i+k] != word[i+j+k]) return NO;
  }
  return    YES;
}

YesNo check( int level) 
{
  if( word[0] != 0) return NO;  // 最初の文字は「ピ」に限る
  for( int i=1; i<= level; i++) {
    if( word[i] == 1 && word[i-1] != 0) return NO;  // ョはピの直後のみ
  }
  for( i=0; i< level; i++) {
    //for( int j=1; j<= (level-i+1)/2; j++) {
    for( int j=1; j<= level-i; j++) {
      if( samestr( level, i, j)) return NO; // 同じ文字列を繰り返したらNG
    }
  }
  return YES;
}

void find( int level)
{
  {
    static int maxLevel = 0;
    if( level > maxLevel) {
      ps( "%3d : ", level);
      for( int i=0; i< level; i++) {
        ps( "%s", c2s[word[i]]);
      }
      ps( "\n");
      maxLevel  = level;
    }
  }
  for( int ch=0; ch<= 2; ch++) {    // 3種類の文字を試す
    word[level] = ch;
    if( check( level)) {        // 文字列に問題なし
      find( level+1);
    }
  }
}

int main( int argc, cstring argv[])
{
  find( 0);
  return    0;
}