【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
",ans%mod);
}
}