其实这是一道简单题不知道为什么1AC

定义\(dp[i][S]\)表示前\(i\)的长度,取了\(S\)这个集合,这样就可以用\(dp[i][S]\)更新\(dp[i+1][S与v]​\)
最后统计一下答案就好了。

代码

#include<bits/stdc++.h>
using namespace std;
const int M=1000003;
int st,cnt,dp[52][1<<15],len,ans,n;//f[x][y]表示到第x位已经考虑了y(二进制表示) 
char c;
class SetOfPatterns{
    public:
        int howMany(vector<string>s,int k){
            n=s.size();
            len=s[0].size();
            for(int i=0;i<len;i++)//考虑每一位 
                for(c='a';c<='z';c++){//考虑这一位上放什么 
                    st=0;//st表示这一位上可以成为c的方案(二进制表示) 
                    for(int j=0;j<n;j++)
                        if(s[j][i]=='?'||s[j][i]==c)st|=1<<j;
                    if(!i)dp[i][st]++;
                    else for(int j=0;j<1<<n;j++)(dp[i][st&j]+=dp[i-1][j])%=M;
                }
            for(int i=0;i<1<<n;i++){
                cnt=0;
                for(int j=0;j<n;j++)
                    if(i&(1<<j))cnt++;
                if(cnt==k)(ans+=dp[len-1][i])%=M;
            }
            return ans;
        }
};