Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], skipTags: ["script","noscript","style","textarea","code"], processEscapes: true }});

問題文

文字列 $S$ が与えられる。$S$ のすべてのアナグラムのうち、回文になっているものの個数を求めよ。

文字列 $X$ が $Y$ のアナグラムであるとは、$X$ が $Y$ と等しいか、$X$ の文字を並び替えたら $Y$ に等しくなることをいう。例えば文字列abcdに対して、abcdやcbdaなどはアナグラムであるが、abedやcabやabcddなどはアナグラムでない。

文字列 $X$ が回文であるとは、$X$ を逆から読んだものが $X$ 自身と等しくなることをいう。例えばabcやabは回文でなく、aやabccbaなどは回文である。

入力

入力は以下の形式に従う。

$S$

制約

$1 \leq |S| \leq 40$ ( $|S|$ は文字列 $S$ の長さ)

$S$ は小文字の英字のみを含む。

答は $2^{63}$ 未満であることが保証される。

出力

個数を1行に出力せよ。

Sample Input 1

ab

Output for the Sample Input 1

0

abのアナグラムはabとbaの二つがあるが、どちらも回文になっていない。

Sample Input 2

abba

Output for the Sample Input 2

2

abbaとbaabの二つの文字列が回文かつアナグラムになっている。

Solution in JAVA (judge verdict: Wrong Answer)

import java.util.*;

class Main{

    long[] kaijo;  
    int[] a;
    String s;
    int len;
	    

    void init(){
	kaijo=new long[21];
	kaijo[0]=1;
	for(int i=1;i<kaijo.length;i++){
	    kaijo[i]=kaijo[i-1]*i;
	}

    }

    void run(){
	init();
	Scanner sc=new Scanner(System.in);
	a=new int[256];
	s=sc.next();
	len=s.length();
	for(int i=0;i<len;i++)a[s.charAt(i)]++;
	System.out.println(count(s));
    }
    long count(String s){
	long res=kaijo[len/2];
	if(len%2==0){
	    for(int i=0;i<a.length;i++)if(a[i]%2==1)return 0L;
	    for(int i=0;i<a.length;i++){
		if(a[i]>=2)res/=kaijo[a[i]/2];
	    }
	}else{
	    int k=0;char c='#';
	    for(int i=0;i<a.length;i++){
		if(a[i]%2==1){
		    c=(char)i;k++;
		}}
	    if(k!=1)return 0L;
	    a[c]--;
	    System.out.printf("odd %d\n",res);
	    for(int i=0;i<a.length;i++){
		if(a[i]>=2)res/=kaijo[a[i]/2];
	    }
	}
	return res;
    }

    public static void main(String[] args){
	new Main().run();
    }
}