提交时间:2024-11-07 18:25:35

运行 ID: 34378

#include<bits/stdc++.h> #define ll long long #define lson pos<<1 #define rson pos<<1|1 using namespace std; const int maxn=1e6+10; const ll mod=1e9+1; const double inf=1e7+10; ll N,n,k,tot=0,m,ans=0,cnt,mn; int a[maxn],b[maxn],fg[maxn],num[maxn<<1],dep[maxn]; char c[maxn]; int son[maxn][4]; int root=0; void update(){ int tmp=0; for(int i=1;i<=m;i++){ int num=c[i]-'0'; if(!son[tmp][num]) son[tmp][num]=++tot,dep[tot]=dep[tmp]+1; tmp=son[tmp][num]; } } void query(int pos,int tmp){ // cout<<pos<<" "<<tmp<<endl; if(tmp>=mn) return; if(dep[pos]==m){ mn=tmp; return; } int num=c[dep[pos+1]]-'0'; if(son[pos][num]) query(son[pos][num],tmp); if(son[pos][num^1]) query(son[pos][num^1],tmp+1); } int main(){ freopen("code.in","r",stdin); freopen("code.out","w",stdout); // memset(lst) scanf("%lld%lld%lld",&n,&m,&k); dep[0]=0; ll ans=0; for(int i=1;i<=n;i++){ scanf("%s",c+1); if(k==1){ ans++; continue; } ll tmp=0; for(int j=1;j<=m;j++){ tmp<<=1; tmp+=(c[j]-'0'); } if(k==2){ if(num[tmp]) ans++; else ans+=2; num[tmp]=1; continue; } mn=k-1; query(0,0); ans+=mn+1; if(!num[tmp]) update(); } printf("%lld",ans); fclose(stdin); fclose(stdout); return 0; }