题意 自己戳好伐?
权限+图片,好吧我懒
很好的状压dp
按说 看到题目的数据范围就应该确定是 状压dp 但是 我想了想 觉得没法搞啊
果断 弃疗
然后 探究样例
发现神奇啊
如果把每一位 可以填的 字符 个数确定就好了 比如eg的25+25 遂发现 不是很好搞。
然后 转化成了 枚举每一位上放哪个字符 可以满足的 n个串里的 数量
然后 在统计 f[i][j]表示 匹配到 第i位字符 的 匹配状态为j 的
转移就变成了 f[i][g[i][k]&j]+=f[i-1][j]
记得 mod答案
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mod 1000003
using namespace std;
//by mars_ch
int g[100][30],f[100][1<<15];
int t,n,K;
char s[100][100];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&K);
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
for(int i=0;i<n;i++)
{
scanf("%s",s[i]);
}
int l=strlen(s[0]);
for(int i=1;i<=l;i++)
{
for(int j=0;j<26;j++)
{
for(int k=0;k<n;k++)
{
if(s[k][i-1] == j+'a' || s[k][i-1] == '?')
{
g[i][j]|=1<<k;
}
}
}
}
f[0][(1<<n)-1]=1;
for(int i=1;i<=l;i++)
{
for(int j=0;j<(1<<n);j++)
{
if(f[i-1][j])
{
for(int k=0;k<26;k++)
{
f[i][g[i][k]&j]=(f[i][g[i][k]&j]+f[i-1][j])%mod;
}
}
}
}
int ans=0;
for(int j=0;j<(1<<n);j++)
{
int p=j,cnt=0;
while(p)
{
cnt+=p&1;
p>>=1;
}
// printf("%d %d\n",j,cnt);
// printf("%d\n",f[l][j]);
if(cnt == K) ans=(ans+f[l][j])%mod;
}
printf("%d\n",ans);
}
return 0;
}