考组合数学的一道题
就拿keneta作为例子(注意这个字符串和Sample Input那个不一样),我们要做的是判断keneta前面有几个字符串。由于在k的字母顺序之前的有a和e,因此我们考虑第一位是a的时候,此时是1个k,2个e,1个n,1个t的排列;然后是第一位是e的时候,1k1e1n1t1a。然后,第一位是k的时候,再考虑第二位的情形。依此类推可以将keneta前的字符串个数求出来。当然,答案别忘了加1,算上那个字符串本身,哈哈~~
就拿keneta作为例子(注意这个字符串和Sample Input那个不一样),我们要做的是判断keneta前面有几个字符串。由于在k的字母顺序之前的有a和e,因此我们考虑第一位是a的时候,此时是1个k,2个e,1个n,1个t的排列;然后是第一位是e的时候,1k1e1n1t1a。然后,第一位是k的时候,再考虑第二位的情形。依此类推可以将keneta前的字符串个数求出来。当然,答案别忘了加1,算上那个字符串本身,哈哈~~
#include<iostream>
using namespace std;
int Analyze(char s[]);
long PermulateItem(int sameitem,long& allitems);
long Permulate();
int times[26];
int main()
{
int result,data,length,pos,pos2;
char s[101];
cin>>data;
while(data-- > 0)
{
cin>>s;
length = Analyze(s);
result = 0;
for(pos=0;pos<length;pos++)
{
for(pos2=0;pos2+'a'<s[pos];pos2++)
{
if(times[pos2]>0)
{
times[pos2]--;
result += Permulate();
times[pos2]++;
}
}
times[s[pos]-'a']--;
}
cout<<++result<<endl;//Calculate itself
}
return 0;
}
int Analyze(char s[])
{
int i;
for(i=0;i<26;i++) times[i] = 0;
for(i=0;s[i]!='\0';i++) times[s[i]-'a']++;
return i;
}
long PermulateItem(int sameitem,long& allitems)
{
if(0==sameitem) return 1;
long result = 1;
int t = sameitem;
while(t>0)
{
allitems++;
t--;
result *= allitems;
}
t = sameitem + 1;
while(t-->1)
result /= t;
return result;
}
long Permulate()
{
long result = 1,pos = 0,count = 0;
for(;pos<26;pos++)
result *= PermulateItem(times[pos],count);
return result;
}
using namespace std;
int Analyze(char s[]);
long PermulateItem(int sameitem,long& allitems);
long Permulate();
int times[26];
int main()
{
int result,data,length,pos,pos2;
char s[101];
cin>>data;
while(data-- > 0)
{
cin>>s;
length = Analyze(s);
result = 0;
for(pos=0;pos<length;pos++)
{
for(pos2=0;pos2+'a'<s[pos];pos2++)
{
if(times[pos2]>0)
{
times[pos2]--;
result += Permulate();
times[pos2]++;
}
}
times[s[pos]-'a']--;
}
cout<<++result<<endl;//Calculate itself
}
return 0;
}
int Analyze(char s[])
{
int i;
for(i=0;i<26;i++) times[i] = 0;
for(i=0;s[i]!='\0';i++) times[s[i]-'a']++;
return i;
}
long PermulateItem(int sameitem,long& allitems)
{
if(0==sameitem) return 1;
long result = 1;
int t = sameitem;
while(t>0)
{
allitems++;
t--;
result *= allitems;
}
t = sameitem + 1;
while(t-->1)
result /= t;
return result;
}
long Permulate()
{
long result = 1,pos = 0,count = 0;
for(;pos<26;pos++)
result *= PermulateItem(times[pos],count);
return result;
}