70分TLE 开了O2
查看原帖
70分TLE 开了O2
1420058
HaloisAWA楼主2024/11/25 07:27
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int ttt,n,k,len,match[60][130];
string s[20];
ll M = 1000003,dp[53][1 << 15 + 3],ans;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> ttt;
	while (ttt--) {
		memset(match,0,sizeof(match));
		memset(dp,0,sizeof(dp));
		cin >> n >> k;
		for (int i = 1;i <= n;i ++)
			cin >> s[i];
		len = s[1].size();
		for (int i = 1;i <= len;i ++)
			for (int j = 'a';j <= 'z';j ++)
				for (int l = 1;l <= n;l ++)
					if (s[l][i - 1] == '?' || s[l][i - 1] == j) match[i][j] |= (1 << (l - 1));
		dp[1][(1 << n) - 1] = 1;
		for (int i = 1;i <= len;i ++)
			for (int S = 0;S < (1 << n);S ++)
				for (int j = 'a';j <= 'z';j ++)
					dp[i + 1][S & match[i][j]] = (dp[i + 1][S & match[i][j]] + dp[i][S]) % M;
		ans = 0;
		for (int S = 0;S < (1 << n);S ++) {
			int tot = 0;
			for (int i = 1;i <= len;i ++)
				if (S & (1 << (i - 1))) ++ tot;
			if (tot == k) ans = (ans + dp[len + 1][S]) % M;
		}
		cout << ans << "\n";
	}
	return 0;
}

2024/11/25 07:27
加载中...