首页 > 其他分享 >[SDOI2009] Bill的挑战

[SDOI2009] Bill的挑战

时间:2024-05-29 21:13:53浏览次数:27  
标签:le return int 挑战 Bill SDOI2009 数据 MOD

[SDOI2009] Bill的挑战

题目信息

题目描述

Sheng_bill 不仅有惊人的心算能力,还可以轻松地完成各种统计。在昨天的比赛中,你凭借优秀的程序与他打成了平局,这导致 Sheng_bill 极度的不满。于是他再次挑战你。这次你可不能输。

这次,比赛规则是这样的:

给出 \(N\) 个长度相同的字符串(由小写英文字母和 ? 组成),\(S_1,S_2,\dots,S_N\),求与这 \(N\) 个串中的刚好 \(K\) 个串匹配的字符串 \(T\) 的个数,答案对 \(1000003\) 取模。

若字符串 \(S_x(1\le x\le N)\) 和 \(T\) 匹配,满足以下条件:

  1. \(|S_x|=|T|\)。
  2. 对于任意的 \(1\le i\le|S_x|\),满足 \(S_x[i]= \texttt{?}\) 或者 \(S_x[i]=T[i]\)。

其中 \(T\) 只包含小写英文字母。

输入格式

本题包含多组数据

第一行一个整数 \(T\),表示数据组数。

对于每组数据,第一行两个整数,\(N\) 和 \(K\)。

接下来 \(N\) 行,每行一个字符串 \(S_i\)。

输出格式

每组数据输出一行一个整数,表示答案。

样例 #1

样例输入 #1

5

3 3

???r???

???????

???????

3 4

???????

?????a?

???????

3 3

???????

?a??j??

????aa?

3 2

a??????

???????

???????

3 2

???????

???a???

????a??

样例输出 #1

914852

0

0

871234

67018

数据规模与约定

  • 对于 \(30\%\) 的数据,\(N\le5\),\(|S_i|\le20\);
  • 对于 \(70\%\) 的数据,\(N\le13\),\(|S_i|\le30\);
  • 对于 \(100\%\) 的数据,\(1\le T\le 5\),\(1\le N \le15\),\(1\le|S_i|\le50\)。

思路分析

这道题和[CEOI2010 day2] pin真的差不多。

显然

\[g(S)=\sum_{T\supseteq S}{f(T)} \]

根据广义容斥原理

\[f(S)=\sum_{T\supseteq S}{(-1)^{|S|-|T|}g(T)} \]

\(g(S)\) 直接暴力求就行了,卡个常,就过了!

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 5e4+10;
namespace math{
	int MOD;
	int frac[MAXN];
	int qpow(int a,int b){
		if(b==0) return 1;
		if(b==1) return a;
		int k = qpow(a,b>>1);
		k*=k;k%=MOD;
		if(b&1) k*=a;k%=MOD;
		return k;
	}
	int inv(int a){
		return qpow(a,MOD-2);
	}
	int C(int n,int m){
		if(n<m) return 0;
		return frac[n]*inv(frac[m]*frac[n-m]%MOD)%MOD;
	}
	int get(int n,int m){
		return C(m+n-1,m);
	}
	void init(){
		frac[0] = 0;
		for(int i = 1;i<MAXN;i++){
			frac[i] = frac[i-1]*i;
			frac[i]%=MOD;
		}
	}
	int lowbit(int k){
		return k&(-k);
	}
	int bit(int k){
		int sum = 0;
		while(k){
			sum ++;
			k -= lowbit(k);
		}
		return sum;
	}
	int log2(int k){
		for(int i = 0;i<=64;i++){
			int p = 1;
			if(p<<i==k) return i;
		}
		return 0;
	}
}
using namespace math;
int n,m,k,g[1<<16],f[1<<16];
bool can[1<<16];
vector<int> v[1<<16];
char tmp[20][60];
void read(int &n){
	char tmp;
	int x = 1;
	do tmp = getchar();
	while(!(tmp=='-'||('0'<=tmp&&tmp<='9')));
	if(tmp=='-'){
		x = -1;
	}
	int gz = 0;
	while('0'<=tmp&&tmp<='9'){
		gz*=10;
		gz+=tmp-'0';
		tmp = getchar();
	}
	n = gz*x;
}
namespace code{
	using namespace math;
signed main(){
	read(n);read(k);
	for(int i = 0;i<n;i++){
		char k;
		k = getchar();
		int u = 0;
		while(k!='\n'){
			tmp[i][u++] = k;
			k = getchar();
		}
		tmp[i][u] = '\0';
	}
	m = strlen(tmp[1]);
	vector<int> p;
	for(int i = 0;i<(1<<n);i++){
		can[i] = 1;g[i] = 1;
		for(int j = 0;j<m;j++){
			char k = '?';
			for(int u:v[i]){
				if(tmp[u][j]!='?'){
					if(k=='?') k = tmp[u][j];
					else if(k!=tmp[u][j]){
						can[i] = false;
						break;
					}
				}
			}
			if(!can[i]) break;
			if(k=='?') g[i]*=26;
			g[i]%=MOD;
		}
		if(!can[i]) g[i] = 0;
		p.push_back(i);
	}
	int ans = 0;
	for(int S:p){
		f[S] = 0;
		if(bit(S)==k){
			for(int T:p){
				if((T&S)==S){
					f[S] += qpow(-1,bit(T)-bit(S))*g[T]%MOD;
					f[S] %= MOD;
				}
			}
			ans += f[S];
			ans%=MOD;
		}
	}
//	cout << 0b1010 << endl;
	cout << (ans%MOD+MOD)%MOD << '\n';
	return 0;
}
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	math::MOD = 1e6+3;
	frac[0] = 1;
	for(int i = 1;i<=MAXN-1;i++){
		frac[i] = frac[i-1]*i;
	}
	for(int i = 0;i<(1<<15);i++){
		int k = i;
		while(k){
			v[i].push_back(math::log2(lowbit(k)));
			k-=lowbit(k);
		}
	}
	int T;
	read(T);
	while(T--){
		code::main();
	}
	return 0;
}

标签:le,return,int,挑战,Bill,SDOI2009,数据,MOD
From: https://www.cnblogs.com/gutongxing/p/18221071

相关文章

  • 青少年CTF擂台挑战赛 2024 #Round 1
    青少年CTF擂台挑战赛2024#Round1crypto1.解个方程题目:欢迎来到青少年CTF,领取你的题目,进行解答吧!这是一道数学题!!p=47435612565218266109508854832282268357q=300321076868253562295973190356379138721e=65537d=?exp:importgmpy2fromCrypto.Util.numberi......
  • AI智能分析技术与安防视频融合当前面临的困难与挑战
    人工智能与安防视频的融合为现代安全领域带来了革命性的变化,提高了安全管理水平、降低了管理成本并为用户提供了更加便捷和高效的服务。随着技术的不断进步和应用场景的不断拓展,未来人工智能与安防的融合将展现出更加广阔的发展前景。然而,AI与安防的融合依旧有许多困难需要克服:1......
  • 盲盒小程序后台管理系统开发中的技术挑战与解决方案
    一、引言盲盒小程序后台管理系统是保障盲盒业务高效运作的关键。然而,在开发过程中,我们不可避免地会遇到一系列技术挑战。本文将针对数据同步、库存管理和订单处理等方面的技术挑战,提出相应的解决方案。二、数据同步挑战与解决方案挑战:在盲盒小程序中,数据同步是一个复杂而......
  • 盲盒小程序后台管理系统开发挑战及应对策略
    一、引言随着盲盒市场的不断壮大,盲盒小程序后台管理系统的开发成为了关键的一环。然而,在开发过程中,我们面临着数据同步、库存管理和订单处理等一系列技术挑战。本文将详细探讨这些挑战,并提出相应的应对策略。二、数据同步挑战与应对策略挑战:在盲盒小程序中,数据同步是一个......
  • 视觉语音识别挑战赛 CNVSRC 2024
        CNVSRC2024由NCMMSC2024组委会发起,清华大学、北京邮电大学、海天瑞声、语音之家共同主办。竞赛的目标是通过口唇动作来推断发音内容,进一步推动视觉语音识别技术的发展。视觉语音识别(也称为读唇技术)是一种通过观察唇部动作推断发音内容的技术,广泛应用于公共安全、......
  • RAG-GPT实践过程中遇到的挑战
    引言大型语言模型(LLM)的新进展,包括ChatGPT,为AI应用提供了新的能力,使其能够构建新的人机交互解决方案、完成复杂任务、总结文档、回答文献中的问题并生成新内容。然而,LLM在获取最新知识或企业内部知识库中的领域特定知识时仍存在局限性。解决此问题的两个选项是:微调LLM(继......
  • 守卫者的挑战
    状态转移我们假设\(f{_i}{_,j}{_,k}\),表示前\(i\)场,赢了\(j\)场,目前背包容量为\(k\)的概率,每一项挑战有两种状态,胜或失败,两种情况答案不同,所以要分开计算,失败状态:\[f_{i,j,k}+=f_{i-1,j,k}*(1-p[i])\]成功状态:\[f_{i,j+1,k+a[i]}+=f_{i-1,j,k}*p[i],(k+a[i]>=0)\]实现......
  • 智慧养老大趋势:迎接未来老龄化社会的挑战与机遇
    随着全球人口老龄化的加速,智慧养老已成为应对这一挑战的重要途径。智慧养老是指利用现代信息技术,特别是物联网、大数据、云计算和人工智能等技术手段,为老年人提供个性化、智能化和便捷化的养老服务。本文将探讨智慧养老的大趋势,分析其背后的驱动因素,并展望智慧养老的未来发展......
  • 守卫者挑战
    守卫者的挑战题目描述打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地。突然,眼前一道亮光闪过。“我,Nizem,是黑魔法圣殿的守卫者。如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图……”瞬间,队员们被传送到了一个擂台上,最初身......
  • MVVM的工作原理和优点及其在实际项目中的优势和挑战
    MVVM的工作原理和优点及其在实际项目中的优势和挑战工作原理:MVVM(Model-View-ViewModel)模式通过引入ViewModel作为Model和View之间的桥梁,实现数据的双向绑定。ViewModel负责封装数据逻辑,暴露可绑定的属性给View,同时监听Model的变化,同步更新视图;反之,View的变化也能通过ViewModel......