标签:blog io os ar for sp div on c
逐位确定其上可填的字母,组合数学题。
注意:当不符合规则时,要求输出0;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string.h>
using namespace std;
int M[30][30];
char s[30];
int num[30];
void initial(){
	memset(M,0,sizeof(M));
	for(int i=0;i<=26;i++)
	M[i][0]=1;
	for(int i=1;i<=26;i++){
		for(int j=1;j<=i;j++){
			if(j==1){
				M[i][j]=i;
			}
			else {
				M[i][j]=M[i][j-1]*(i-j+1)/j;
			}
		}
	}
}
int main(){
	initial();
	while(scanf("%s",s)!=EOF){
		int len=strlen(s);
		for(int i=1;i<=len;i++)
		num[i]=s[i-1]-‘a‘+1;
		num[0]=0;
		bool flag=true;
		for(int i=1;i<=len;i++)
		if(num[i]<=num[i-1]){
			flag=false;
			break;
		}
		if(!flag){
			printf("0\n");
			continue;
		}
		int pos=0;
		for(int i=1;i<len;i++)
		pos+=M[26][i];
		for(int i=1;i<=len;i++){
			for(int k=num[i-1]+1;k<num[i];k++){
				pos+=(M[26-k][len-i]);
			}
		}
		printf("%d\n",pos+1);
	}
	return 0;
}
标签:blog io os ar for sp div on c
原文地址:http://www.cnblogs.com/jie-dcai/p/3993584.html