记录编号 15933 评测结果 AAAAAAAAAA
题目名称 [SDOI 2009] Bill的挑战 最终得分 100
用户昵称 Gravatar.Xmz 是否通过 通过
代码语言 C++ 运行时间 1.445 s
提交时间 2010-04-13 09:45:00 内存使用 14.05 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>

using namespace std;

int f[55][1 << 16],ok[55][200];
char s[18][55];

int n,k,T,len;

inline bool match(char a,char b)
{
	return (a=='?' || b=='?' || a==b);
}

void init()
{
	scanf("%d%d",&n,&k);
	for (int i=1;i<=n;i++)
	{
		scanf("%s",s[i]+1);
	}
	len=strlen(s[1]+1);
	memset(f,0,sizeof(f));
	memset(ok,0,sizeof(ok));
}

void mo(int &a)
{
	while (a>1000003) a -= 1000003;
}

void dp()
{
	f[0][(1<<n)-1] = 1;
	
	for (int i=1;i<=len;i++)
	{
		for (char c='a';c<='z';c++)
		{
			for (int j=1;j<=n;j++)
			{
				if (match(s[j][i],c)) ok[i][(int)c] += (1<<(j-1));
			}
		}
	}
	
	
	for (int i=0;i<len;i++)
	{
		for (int j=1;j<(1<<n);j++)
		{
			if (f[i][j])
			for (char c='a';c<='z';c++)
			{
				if ((ok[i+1][(int)c] & j))
				{
					f[i+1][ok[i+1][(int)c] & j] += f[i][j];
					mo(f[i+1][ok[i+1][(int)c] & j]);
				}
			}
		}
	}
}

void print()
{
	int ans=0;
	for (int i=1;i<(1<<n);i++)
	{
		int count=0;
		for (int j=0;j<n;j++)
			count += ((i>>j) & 1);
		if (count == k) 
		{	
			ans+=f[len][i];
			mo(ans);
		}
	}
	printf("%d\n",ans);
}

int main()
{
	freopen("set.in","r",stdin);
	freopen("set.out","w",stdout);
	scanf("%d",&T);
	for (int i=1;i<=T;i++)
	{
		init();
		dp();
		print();
	}
	return 0;
}