| 比赛 |
期末考试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;
}