算法竞赛宝典 递推算法 密文传送

【问题描述】密文传送(encode.cpp/c/pas)

黑暗军团的情报采用密文传输,即把一些有规律的单词编成数字。其原理是:字母表中共有26个小写字母{a,b,…,z},这些特殊的单词长度不超过20且字母按升序排列。把所有这样的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在字典中的位置。例如:a→1, b→2, z→26, ab→27, ac→28。

你的任务就是对于所给的单词,求出它的编码。

【输入格式】

仅一行,被编码的单词。

【输出格式】

仅一行,对应的编码。如果单词不在字母表中,输出0。

【输入样例】

ab

【输出样例】

27

#include<iostream>
#include<cstring>
#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
int c(int m,int n)
{
	if(n==0)
		return 1;
	int s=1;
	int p=2;
	for(int k=m; k>=m-n+1; k--)
	{
		s*=k;
		if(s%p==0 && p<=n)
		{
			s/=p;
			p++;
		}
	}
	return s;  
}

int main()
{
	char s[100];
	int num[100];
	ll sum;
	while(~scanf("%s",s))
	{
		num[0]=0;
		sum=0ll;
		int len=strlen(s);
		for(int i=0; i<len; i++)
		{
			num[i+1]=s[i]-'a'+1;
		}
		if(len>1)
		{
			for(int i=1; i<len; i++)
			{
				for(int j=num[i-1]+1; j<num[i]; j++)
				{
					sum+=c(26-j,len-i); 
				}
			}
			sum+=num[len]-num[len-1];
		}
		else
			sum+=num[1];
		printf("%lld\n",sum);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/CJ_035/article/details/79762265