OUPC2012 問題G Palindromic Anagram (AOJ2356)
制約条件
S | ≦40 |
Sは英小文字からなる
答えは2^63以下に収まる
方針
ビットDPするか、コンビネーションを使って適当に求める。
sの長さが奇数のときは、1種類のアルファベットが中央に来る。
ほかのsに含まれる文字は全部2の倍数個でなければならない。
そうなってなかった場合は0を出力する。
ソースコード
ll C(int n,int k){ ll res=1; rep(i,k)res*=n-i, res/=i+1; return res; } int main(){ int n,cnt[26]={}; string in; cin>>in; n=in.size(); rep(i,n)cnt[in[i]-'a']++; if(n%2){ int odd=0; rep(i,26)if(cnt[i]%2)odd++, cnt[i]--; if(odd!=1){ cout<<0<<endl; return 0; } } n/=2; rep(i,26){ if(cnt[i]%2){ cout<<0<<endl; return 0; } cnt[i]/=2; } ll ans=1; rep(i,26)ans*=C(n,cnt[i]), n-=cnt[i]; cout<<ans<<endl; return 0; }