【BestCoder Round #77 (div.2)】xiaoxin juju needs help(排列与组合)

xiaoxin juju needs help

 

 Accepts: 8
Submissions: 11

 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
xiaoxin巨从小就喜欢字符串,六年级的时候他就知道了什么是回文串。这时,xiaoxin巨说到:如果一个字符串 SS 是回文串,那么该字符串从前往后看和从后往前看是一样一样的。

六年级的暑假,xiaoxin很快就做完了暑假作业,然后到腾讯做起了实习生。这日,leader给了xiaoxin一个字符串,请xiaoxin帮忙写一个函数来生成所有可能的回文串,可以任意改变字符串的顺序但是不可以扔掉某个字符。并且leader告诉xiaoxin,每生成一个不一样的回文串就可以得到一颗西瓜糖。

请你帮忙计算xiaoxin的leader最多需要买多少颗西瓜糖呢?
输入描述
多组测试数据。第一行包含一个整数 T(T\leq 20)T(T20) 表示组数。每组测试数据给出一个只包含小写字母的字符串 S(1\leq length(S)\leq 1,000)S(1length(S)1,000)
输出描述
对于每组测试数据,输出一个数, 表示leader需要买的西瓜糖的个数,结果对 1,000,000,0071,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;
}


你可能感兴趣的:(【BestCoder Round #77 (div.2)】xiaoxin juju needs help(排列与组合))