题意:这个题就是给你一个序列a,b,c,d,e,f.............z,ab,.........az,bc,......vwxyz
1,2,3,4,5,6 26,27...... 51,52 83681
然后给你一个序列问你这个序列是第几个序列
下面看思路:
说这道题之前我先说一个神奇的东西,我们先来看一下杨辉三角
1
1 1
1 2 1
1 3 3 1
下面的我就不写了
我们可以发现他们每个值对应的xy坐标用组合来选择正好是对应的例如C2/2整好是1,C3/1整好是3
所以以后写组合的值我们可以用杨辉三角来打表
下面不墨迹解题:这道题 我们要分两步来求 先求出来从第一个到它这个长度的第一个中间有多少个,比如我们要求
vwxyz 我们需要先求出a到abcde之间有多少个然后再求出abcde到vwxyz之间有多少个
我们先来解决第一步:我们先看啊一位总共有C26/1个 两位有C26/2个 所以第一步我们就很容易解决了
第二步:我在程序中已经有明确说明下面看程序吧
#include<functional>
#include<algorithm>
#include<iostream>
#include<fstream>
#include<sstream>
#include<iomanip>
#include<numeric>
#include<cstring>
#include<cassert>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<list>
#include<set>
#include<map>
using namespace std;
int c[33][33] = {0};
int bin[35]; //这个是用来存储最大内个二进制数的
void zuhe()
{
for(int i = 0;i < 33;i++)
{
for(int j = 0;j <= i;j++)
{
if(j == 0||i == j)
{
c[i][j] = 1;
}
else
{
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
}
}
}
return;
}
int main()
{
char str[11];
zuhe();
int i;
while(~scanf("%s",str))
{
int len = strlen(str);
for(i = 1;i < len;i++)
{
if(str[i - 1] >= str[i]) //如果输入的不合理我们就直接结束比如aab ba
{
printf("%d\n",0);
return 0;
}
}
int sum = 0;
for(i = 1;i < len;i++) //这个地方就是求出从a到它的位数的 第一个中间有多少个
{
sum = sum + c[26][i];
}
for(i = 0;i < len;i++) //i就是指出这个字符串中的第几个字母
{
char ch = (!i)?'a':str[i - 1] + 1; //因为每一位的字母都是递增的 所以我们要从上一位加1开始
while(ch <= str[i] - 1) //这一位还要小于下一位
{
sum = sum + c['z' - ch][len - i - 1]; //因为比ch小的字母不能用了 所以还剩下‘z’ - ch个字母 在这些中选出len - i - 1个
ch++;
}
}
printf("%d\n",sum + 1); //因为我们之前算的是在给的字母之前有多少个 我们还得把给的这个字母算上所以+1
}
return 0;
}