Medium Counting

版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/83004476

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N=55,L=22,C=33,mod=990804011;
char s[N][L];
int n,m,dp[N][N][L][C],a[N][L];
inline int dfs(int l,int r,int p,int c)
{
 int &f=dp[l][r][p][c];
 if(~f)
  return f;
 if(l>r)
  return f=1;
 if(p>m)
  return f=(l==r);
 if(c>26)
  return f=0;
 f=dfs(l,r,p,c+1); 
 for(int i=l;i<=r;i++)
 {
  if(!(a[i][p]==c||(a[i][p]==27&&c)))
   break;
  f=(f+1ll*dfs(l,i,p+1,0)*dfs(i+1,r,p,c+1))%mod;
 }
 return f;
}
int main()
{
 scanf("%d",&n);
 memset(dp,-1,sizeof(dp));
 for(int i=1,l;i<=n;i++)
 {
  scanf("%s",s[i]+1);
  m=max(m,l=strlen(s[i]+1));
  for(int j=1;j<=l;j++)
  {
   if(s[i][j]=='?')
    a[i][j]=27;
   else 
    a[i][j]=s[i][j]-'a'+1;
  }
 }
 printf("%d\n",dfs(1,n,1,0));
 return 0;
}

来源:zr

猜你喜欢

转载自blog.csdn.net/qq_42500298/article/details/83004476