题目链接
 
POJ1850
 
题目大意
 
输出某个字符串str在字典中的位置,若不是字典中的字符则输出0。  字典中的单词如下图(单词中每个字母严格递增):  
 
分析
 
这是一道组合数学题。对于给定字符串str,首先判断其每个字母是否严格递增。  若是字典中的字符,可以先计算长度比str小的符合字典要求的字符串总数sum1,再计算长度等于str的符合字典要求的字符串总数sum2,sum1+sum2+1即为答案。  对于求sum1:我们可以求出长度为m的符合字典要求的字符总数为
  
   Cm26
  ,因为字典中的单词没有字母重复,且排列唯一(严格递增),因此就是一个组合。  对于求sum2:自己写的时候不是写得很清楚,参考了别人博客的代码。思路详见程序注释。
 
代码
 
#include <iostream>
#include <string>
using namespace std;
int c[
27][
27],len;
void Make_C()
{
    
for (
int i=
0;i<=
26;i++)
        
for (
int j=
0;j<=i;j++)
            
if (!j||i==j)
                c[i][j]=
1;
            
else
                c[i][j]=c[i-
1][j-
1]+c[i-
1][j];
}
int Code(string 
str)
{
    
int sum=
0,i;
    
    
for (i=
1;i<=len-
1;i++)
        
sum+=c[
26][i];
    
    
for (i=
0;i<len;i++)
    {
        
char ch=(!i)?
'a':
str[i-
1]+
1;
        
while (ch<=
str[i]-
1)  
        {
            
sum+=c[
'z'-ch][len-
1-i];
            ch++; 
        }
    }
    
return sum+
1;
}
int main()
{
    string 
str;
    
int i;
    bool flag;
    Make_C();
    cin>>
str;
    len=
str.length();
    flag=
true; 
    
for (i=
0;i<len-
1;i++)
        
if (
str[i]>=
str[i+
1])
        {
            flag=
false;
            
break;
        }
    
if (flag)
        cout<<Code(
str)<<endl;
    
else
        cout<<
0<<endl;
    
return 0;
}
                
                
                
        
    
                    转载请注明原文地址: https://ju.6miu.com/read-7015.html