题目链接:http://poj.org/problem?id=1850
我发现我是超级马虎啊!本来可以一遍过的,因为题没有读完整,少了后面说不满足输出0 啊,结果多交了一次!!!!
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
__int64 a[15][28];//代表i字母后面长度为j的个数的
void dp()
{
int i,j,k;
for(i=0; i<15; i++)
for(j=0; j<28; j++)
a[i][j]=0;
for(i=1; i<27; i++)
a[1][i]=1;//i开头的长度为1 的
a[1][27]=26;
for(i=2; i<15; i++)
{
for(j=1; j<=27-i;j++)
{
for(k=j+1; k<=26; k++)
a[i][j]+=a[i-1][k];
a[i][27]+=a[i][j];
}
}
/* for(i=1; i<15; i++)
{
for(j=1; j<=27; j++)
printf("%I64d ",a[i][j]);
printf("\n");
}*/
}
int main()
{
char s[15];
int len,i,j;
__int64 t;
dp();
while(scanf("%s",s)!=EOF)
{
len=strlen(s);
int sign=0;
for(i=1; i<len; i++)
if(s[i]<=s[i-1])
{
printf("0\n");
sign=1; break;
}
if(sign==1)
continue;
t=0;
for(i=0; i<len; i++)
s[i]=s[i]-'a'+1;
int end=0;
for(i=0; i<len; i++)
{
for(j=end+1; j<s[i]; j++)
{
t+=a[len-i][j];
}
end=s[i];
}
for(i=1; i<len; i++)
t+=a[i][27];
printf("%I64d\n",t+1);
}
return 0;
}