题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5651
题目大意:
改变所给字符串里面的字符的任意顺序,问组成回文串的方案数。
范围:
字符串长len<=1000。
思路:
根据回文串的性质,我们可以只考虑前半部分的串的构成。所以最多只有一种字母的个数为奇数。
所以剩下的情况就是组合数取几个的方案数的求和了。
代码:
#include<stdio.h>
#include<string.h>
#define ll __int64
#define mod 1000000007
ll c[1005][1005];
int main()
{
char s[1005];
int vis[26];
int i,j,k,l,T,t;
ll sum,ans,a,b;
for(i=0;i<=1000;i++)
c[i][0]=1;
for(i=1;i<=1000;i++)
{
for(j=1;j<=i;j++)
{
if(i==j)c[i][j]=1;
else if(i>j)
c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
}
scanf("%d",&T);
while(T--)
{
sum=0;
t=0;
scanf("%s",s);
l=strlen(s);
memset(vis,0,sizeof(vis));
for(i=0;i<l;i++)
{
vis[s[i]-'a']++;
}
for(i=0;i<26;i++)
{
if(vis[i]%2)t++;
vis[i]/=2;
sum+=vis[i];
}
if(t>1){
printf("0\n");
}
else {
ans=1;
int len=l/2;
for(j=0;j<26;j++)
{
ans=((ans%mod)*(c[len][vis[j]]%mod))%mod;
len-=vis[j];
}
printf("%I64d\n",ans%mod);
}
}
}