如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:
abcd 0
abdc 1
acbd 2
acdb 3
adbc 4
adcb 5
bacd 6
badc 7
bcad 8
bcda 9
bdac 10
bdca 11
cabd 12
cadb 13
cbad 14
cbda 15
cdab 16
cdba 17
...
现在有不多于10个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?
【输入格式】
一行,一个串。
【输出格式】
一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。
例如:
输入:
bdca
程序应该输出:
11
再例如:
输入:
cedab
程序应该输出:
70
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
bool algh[30]={false};
int main(int argc,char **argv)
{
char temp[30]={0};
scanf("%s",temp);
int i,len=strlen(temp);
for(i=0;i<len;i++)
algh[temp[i]-'a'+1]=true;
int ans=0;
for(i=0;i<len-1;i++)
{
int j,nsp=1,isp=1;
for(j=i+1;j<len;j++)
{
nsp*=isp;
isp++;
}
int endp=0;
for(j=temp[i]-'a';j>0;j--)
if(algh[j]==true)
endp++;
algh[temp[i]-'a'+1]=false;
ans+=endp*nsp;
}
printf("%d\n",ans);
return EXIT_SUCCESS;
}
算是全排列的规律或者定义吧。
每一位需计算比它小的字母的个数*后面所有字母全排列的可能性。
如cedab
c:当前比它小的字母有 a、b —— 2*4!=48
e:当前比它小的字母有 a、b、d —— 3*3!=18
d:当前比它小的字母有 a、b —— 2*2!=4
a:当前比它小的字母有 —— 0*1!=0
ans=48+18+4+0=70
如bdca
b:当前比它小的字母有 a —— 1*3!=6
d:当前比它小的字母有 a、c —— 2*2!=4
c:当前比它小的字母有 a —— 1*1!=1
ans=6+4+1=11