Fancy Mouse
- -|||
考组合数学的一道题
就拿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;
}
posted on 2005-10-05 02:05  Fancy Mouse  阅读(389)  评论(1编辑  收藏  举报