anchor.diff:  % キーはリスト(文字列)限定
   % 値は何でもOK
   % 機能は空マップ生成、キーによる値の配置と参照、
  -% および全データの取得のみ
  -%  空マップ生成 map_new()
  -%  配置         map_put( key, value, map )
  -%  参照         map_get( key, map )
  -%  全データ取得 map_data( map )
  +% および全データの列挙のみ
  +%  空マップ生成 map_new() -> map
  +%  配置         map_put( key, value, map ) -> map
  +%  参照         map_get( key, map ) -> {ok, value } or nothing
  +%  全データ列挙 map_enumerator( map ) -> enumerator or noitem
  +%   キーと値を取得 enumerator_get( enumerator ) -> { key, value } or nothing
  +%   次のデータ     enumerator_next( enumerator ) -> enumerator or noitem
   
   comp([],[]) -> eq;
   comp(_,[]) -> gt;
  
positive.code:             if
                  LLD > LRD -> % 左の木の左が深いなら左の木を上げる
                      NR = map_rotate({map, KV, LR, R, 0}),
                      {map, KVL, LL, NR, max([LLD|[map_depth(NR)]]) + 1};
                  true -> % 左の木の右が深いなら左の木の右を上げる
                      {_, KVLR, LRL, LRR, _} = LR,
                      NR = map_rotate({map, KV, LRR, R, 0}),
                      NL = map_rotate({map, KVL, LL, LRL, 0}),
                      {map, KVLR, NL, NR, max([map_depth(NL)|[map_depth(NR)]]) + 1}
              end;
          X when X < -1 -> % 右の木が深過ぎ
              {_, KVR, RL, RR, _} = R,
  
negative.code: -import(lists,[reverse/1,max/1]).
  
  main(_) ->
      [_|W] = tokens(get_chars("",20000)," \n"),
      format("~s",[solve(W)]),
      halt().
  
  solve(W) ->
      M = mapping(W),
      palindrome(M, map_enumerator(M)).
  
  palindrome(M, W) -> palindrome(M, W, "", "", "").
  
  palindrome(_, noitem, L, C, R) -> concat(L, concat(C, R));
  palindrome(M, E, L, C, R) ->
      {H, V} = enumerator_get(E),
      T = enumerator_next(E),
      HR = reverse(H),
      case comp(H, HR) of
          gt -> palindrome(M, T, L, C, R);
  