比赛 期末考试0 评测结果 AAAAAAAAAA
题目名称 学姐的下午茶 最终得分 100
用户昵称 yyswys 运行时间 0.951 s
代码语言 C++ 内存使用 3.73 MiB
提交时间 2026-02-07 10:48:42
显示代码纯文本
#include<bits/stdc++.h>
#define ciallo ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
const int N=2005,mod=1e9+7;
int n,suma,p[N],len[N],s0[N],s1[N],sa[N],ans;
string s[25];
int main(){
	freopen("lowtea.in","r",stdin);
	freopen("lowtea.out","w",stdout);
	ciallo
	cin>>n;
	for(int i(0);i<n;++i){
		cin>>s[i];
		len[i]=s[i].length();
		for(int j(0);j<len[i];++j){
			if(s[i][j]=='?') suma++;
		}
	}
	p[0]=1;
	for(int i(1);i<=suma;++i){
		p[i]=p[i-1]*2%mod;
	}
	for(int j(0);j<100;++j){
		for(int i(0);i<n;++i){
			if(len[i]>j){
				if(s[i][j]=='0'){
					s0[j]|=(1<<i);
				}else if(s[i][j]=='1'){
					s1[j]|=(1<<i);
				}else{
					sa[j]|=(1<<i);
				}
			}
		}
	}
	for(int i(1);i<(1<<n);++i){
		int ml=101;
		for(int j(0);j<n;++j){
			if((i>>j)&1) ml=min(ml,len[j]);
		}
		int curq=suma;
		long long res=p[curq];
		for(int j(0);j<ml;++j){
			if((i&s0[j])&&(i&s1[j])) break;
			int qsum=__builtin_popcount(i&sa[j]);
			curq-=qsum;
			if(!(i&s0[j])&&!(i&s1[j])){
				++curq;
			}
			res=(res+p[curq])%mod;
		}
		if(__builtin_popcount(i)%2==1){
			ans=(ans+res)%mod;
		}else{
			ans=(ans-res+mod)%mod;
		}
	}
	cout<<ans<<"\n";
	return 0;
}