思路:

其实数学真的不算差,静下心来推一推公式还是比较有希望的,真的是很忌讳上来就觉得是数位dp然后就套模板的做法,尤其是之后套进去只差了一点就不舍得放弃,其实还是应该先想清楚做法再动键盘。

公式:

设:

p[i]=c[i]a+1

那么最终答案为:
ans=i=1n1Ci26+i=1nj=p[i1]+1p[i]1Cni26j

代码:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
#define maxn 100
char temp[100];
long long int p[100],k[500][500];
int n;
long long int C(int x,int y)
{
    if(k[x][y]!=-1)return k[x][y];
    if(x<0||x>y)return 0;
    if(x==0||x==y)return 1;
    return k[x][y]=C(x-1,y-1)+C(x,y-1);
}
int main()
{
    memset(k,-1,sizeof(k));
    while(scanf("%s",temp+1)!=EOF)
    {
        memset(p,0,sizeof(p));
        n=strlen(temp+1);
        for(int i=1;i<=n;i++)
        {
            p[i]=(long long int)(temp[i]-'a'+1);
        }
        for(int i=0;i<n;i++)
        {
            if(p[i]>=p[i+1])
            {
                printf("0\n");return 0;
            }
        }
        long long int ans=0;
        for(int i=1;i<n;i++)
        {
            ans+=C(i,26);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=p[i-1]+1;j<p[i];j++)
            {
                ans+=C(n-i,26-j);
            }
        }
        printf("%lld\n",ans+1);
    }

}