【Sdoi2009】Bill的挑战 状态压缩

【Sdoi2009】Bill的挑战 状态压缩


问题:
此处输入图片的描述


解:
此处输入图片的描述

此处输入图片的描述

方案不会算重 因为到达的顺序一定不一样


code:

  //
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define maxnn 46496
#define mod 1000003
ll f[55][maxnn];
ll g[55][maxnn];
string s[1000];
int T;
ll n,k;
ll all=0;
ll ans=0;
int main() {
	cin>>T;
	while(T--) {
		scanf("%lld%lld",&n,&k);
		int tmp=0;
		ans=0;
		for(int i=1; i<=n; i++) {
			cin>>s[i];
		}
		tmp=s[1].size();
		all=(1<<n)-1;
		for(int i=0; i<=tmp; i++)
			for(int j=0; j<=all; j++) f[i][j]=0;
			for(int i=0; i<=tmp; i++)
			for(int j=0; j<=26; j++) g[i][j]=0;
		for(int i=1; i<=n; i++) {
			for(int j=0; j<s[i].size(); j++) {
				if(s[i][j]=='?') {
					for(int kk=1; kk<=26; kk++)
						g[j+1][kk]|=(1<<i-1);
				} else
					g[j+1][(s[i][j]-'a')+1]|=(1<<i-1);
			}
		}
		for(int p=0; p<=26; p++)
			f[1][g[1][p]]++;
		for(int i=1; i<=tmp; i++) {
			for(int j=0; j<=all; j++) {
				for(int kk=1; kk<=26; kk++) {
					f[i+1][j&(g[i+1][kk])]+=f[i][j];
					f[i+1][j&(g[i+1][kk])]%=mod;
				}
			}
		}
		for(int s=0; s<=all; s++) {
			int t=0;
			for(int i=s; i; i=i-(i&-i)) {
				t++;
			}
			if(t==k) {
				ans+=f[tmp][s];
				ans%=mod;
			}
		}
		printf("%lld\n",ans%mod);
	}

}
posted @ 2019-08-30 16:39  ALEZ  阅读(130)  评论(0编辑  收藏  举报