xiaoxin juju needs help
Accepts: 8
Submissions: 11
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
xiaoxin巨从小就喜欢字符串,六年级的时候他就知道了什么是回文串。这时,xiaoxin巨说到:如果一个字符串 S 是回文串,那么该字符串从前往后看和从后往前看是一样一样的。
六年级的暑假,xiaoxin很快就做完了暑假作业,然后到腾讯做起了实习生。这日,leader给了xiaoxin一个字符串,请xiaoxin帮忙写一个函数来生成所有可能的回文串,可以任意改变字符串的顺序但是不可以扔掉某个字符。并且leader告诉xiaoxin,每生成一个不一样的回文串就可以得到一颗西瓜糖。
请你帮忙计算xiaoxin的leader最多需要买多少颗西瓜糖呢?
输入描述
多组测试数据。第一行包含一个整数 T(T≤20) 表示组数。每组测试数据给出一个只包含小写字母的字符串 S(1≤length(S)≤1,000)
输出描述
对于每组测试数据,输出一个数, 表示leader需要买的西瓜糖的个数,结果对 1,000,000,007 取模。
输入样例
3 aa aabb a
输出样例
1 2 1
猛地一看以为多难,其实还是排列与组合。但是现在还有一个问题,为什么有的时候不能取余呢?(本来宏定义了MOD,结果总是报错,后来只好改成变量了,求大神们说明一下)
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
int c[511][511];
long long MOD = 1e9+7;
void C()
{
for (int i=0;i<=500;i++)
c[i][0]=1;
for (int i=1;i<=500;i++)
{
for (int j=1;j<=i;j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j]) % MOD;
}
}
int main()
{
int u;
char a[1111];
int num[27];
int l;
C();
scanf ("%d",&u);
while (u--)
{
scanf ("%s",a);
memset(num,0,sizeof (num));
l = strlen (a);
for (int i = 0 ; i < l ; i++)
num[a[i]-'a'+1]++;
int odd = 0;
for (int i = 1 ; i <= 26 ; i++)
{
if (num[i] & 1)
{
odd++;
num[i] = 0;
}
else
num[i] /= 2;
}
if (odd > 1 || (odd == 1 && (l & 1) == 0)) //特判一下
{
printf ("0\n");
continue;
}
l /= 2;
long long ans = 1;
for (int i = 1 ; i <= 26 ; i++)
{
ans = (ans * c[l][num[i]]) % MOD;
l -= num[i];
}
printf ("%I64d\n",ans);
}
return 0;
}