code: // derived from C
  final class LastLetterFirstLetter {
      static int maxPathLength = 0;
      static int maxPathLengthCount = 0;
      static final StringBuffer maxPathExample = new StringBuffer(500);
  
      static final String[] names = {"audino", "bagon", "baltoy", "banette",
          "bidoof", "braviary", "bronzor", "carracosta", "charmeleon",
          "cresselia", "croagunk", "darmanitan", "deino", "emboar",
          "emolga", "exeggcute", "gabite", "girafarig", "gulpin",
          "haxorus", "heatmor", "heatran", "ivysaur", "jellicent",
          "jumpluff", "kangaskhan", "kricketune", "landorus", "ledyba",
          "loudred", "lumineon", "lunatone", "machamp", "magnezone",
          "mamoswine", "nosepass", "petilil", "pidgeotto", "pikachu",
          "pinsir", "poliwrath", "poochyena", "porygon2", "porygonz",
          "registeel", "relicanth", "remoraid", "rufflet", "sableye",
          "scolipede", "scrafty", "seaking", "sealeo", "silcoon",
          "simisear", "snivy", "snorlax", "spoink", "starly", "tirtouga",
          "trapinch", "treecko", "tyrogue", "vigoroth", "vulpix",
          "wailord", "wartortle", "whismur", "wingull", "yamask"};
  
      static void recursive(String[] part, int offset) {
          if (offset > maxPathLength) {
              maxPathLength = offset;
              maxPathLengthCount = 1;
          } else if (offset == maxPathLength) {
              maxPathLengthCount++;
              maxPathExample.setLength(0);
              for (int i = 0; i < offset; i++) {
                  maxPathExample.append((i % 5 == 0 ? "\n  " : " "));
                  maxPathExample.append(part[i]);
              }
          }
          final char lastChar = part[offset - 1].charAt(part[offset - 1].length()-1);
          for (int i = offset; i < part.length; i++) {
              if (part[i].charAt(0) == lastChar) {
                  String tmp = names[offset];
                  names[offset] = names[i];
                  names[i] = tmp;
                  recursive(names, offset+1);
                  names[i] = names[offset];
                  names[offset] = tmp;
              }
          }
      }
  
      public static void main(String[] args) {
          for (int i = 0; i < names.length; i++) {
              String tmp = names[0];
              names[0] = names[i];
              names[i] = tmp;
              recursive(names, 1);
              names[i] = names[0];
              names[0] = tmp;
         }
         System.out.println("maximum path length        : " + maxPathLength);
         System.out.println("paths of that length       : " + maxPathLengthCount);
         System.out.println("example path of that length:" + maxPathExample);
      }
  }
  