提交时间:2024-11-07 20:11:04
运行 ID: 34435
#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; }