两题除了字符串长度不同之外没有区别。
题意:字符串的合法排序规则为:长度小的靠前,同长度则按字典序,每个字符串内部字母都是升序的。
思路:因为满足字符串内部也都是升序的,所以对于长度为L的字符串,满足条件的个数便是从26个字母中选出L个,即C[26][L]。借此统计比它短的部分,等长度的串枚举解决。
本题方法很多,可以动态规划:http://blog.sina.com.cn/s/blog_6635898a0100lkac.html 或者暴力: http://www.cnblogs.com/illuminator/archive/2013/03/22/POJ1496.html
#include <cstdio>
#include <cstring>
int c[30][30];
void Init ()
{
for (int i=0;i<=26;i++)
{
c[i][0]=c[i][i]=1;
for (int j=1;j<i;j++)
c[i][j]=c[i-1][j]+c[i-1][j-1];
}
}
int main ()
{
Init();
char str[20];
while (~scanf("%s",str))
{
bool flag=false;
int len=strlen(str),i;
for (i=0;i<len-1;i++)
if (str[i]>=str[i+1])
flag=true;
if (flag)
{
printf("0\n");
continue;
}
int sum=0;
for (i=1;i<len;i++)
sum+=c[26][i];
for (i=0;i<len;i++)
{
char ch;
if (i==0)
ch='a';
else
ch=str[i-1]+1;
for (char j=ch;j<str[i];j++)
sum+=c['z'-j][len-1-i];
}
printf("%d\n",sum+1);
}
return 0;
}