Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34435 | baka24 | 【S】T2 | C++ | 通过 | 100 | 543 MS | 13444 KB | 1366 | 2024-11-07 20:11:04 |
#include<bits/stdc++.h> using namespace std; #define popcnt __builtin_popcount int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while('0'<=c&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=2000010,N=23,M=21; int n,m,k,ans,a[MAXN]; char c[N]; void slvn2(){ for(int i=1;i<=n;i++){ int tmp=k; for(int j=1;j<i;j++)tmp=min(tmp,popcnt(a[i]^a[j])+1); ans+=tmp; } printf("%d",ans); } void slvk1(){ printf("%d",n); } int f[(1<<M)+10]; void slvk2(){ for(int i=1;i<=n;i++){ if(f[a[i]])ans++; else ans+=2; f[a[i]]=1; } printf("%lld",ans); } queue<int>q; void bfs(int x){ q.push(x); f[x]=1; while(!q.empty()){ int u=q.front();q.pop(); for(int i=0;i<m;i++)if(f[u]+1<f[u^(1<<i)]){ f[u^(1<<i)]=f[u]+1; q.push(u^(1<<i)); } } } void slv(){ for(int i=0;i<1<<m;i++)f[i]=k; for(int i=1;i<=n;i++){ ans+=f[a[i]]; bfs(a[i]); } printf("%lld",ans); } signed main(){ n=read(),m=read(),k=read(); for(int i=1;i<=n;i++){ scanf("%s",c); for(int j=0;j<m;j++)a[i]+=(c[j]-'0')<<j; } if(n<=1000)slvn2(); else if(k==1)slvk1(); else if(k==2)slvk2(); else slv(); return 0; }