Solution#
EricQian 很有精神!114514
我们都要像他一样有精神!114514
EricQian 说你可以设一个 d 表示恰好某些位置相同的对数,p 表示至少某些位置相同的对数,D 表示恰好几个位置相同的对数,P 表示至少几个位置相同的对数。114514
EricQian 说 P 和 p 都可以直接求。于是我们来考虑 D 和 d 的求法。114514
EricQian 觉得你很逊,于是他来帮你颓式子:114514
D4=P4D3=d123+d124+d134+d234=(p123−p1234)+(p124−p1234)+(p134−p1234)+(p234−p1234)=P3−4D4D2=d12+d13+d14+d23+d24+d34=(p12−d123−d124−d1234)+(p13−d123−d134−d1234)+(p14−d124−d134−d1234)+(p23−d123−d234−d1234)+(p24−d124−d234−d1234)+(p34−d134−d234−d1234)=P2−3D3−6D4D1=d1+d2+d3+d4=(p1−d12−d13−d14−d123−d124−d134−d1234)+(p2−d12−d23−d24−d123−d124−d234−d1234)+(p3−d13−d23−d34−d123−d234−d134−d1234)+(p4−d14−d24−d34−d124−d134−d234−d1234)=P1−2D2−3D3−4D4
哇!这真是太有精神了吧!真的没有再比这样的事情更有精神了!114514
我们的 EricQian 真是太厉害了!大家快来膜拜 EricQian!!!114514
Code#
#define int long long
using namespace std;
const int MAXN=5e4+10;
map<string,int> cnt;
string s[MAXN];
int P[MAXN],D[MAXN];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n,d;cin>>n>>d;
rep(i,1,n) cin>>s[i];
rep(i,1,15){
int ppc=__builtin_popcount(i);
cnt.clear();
rep(j,1,n){
string t;
rep(k,0,3)
if(i&(1<<k))
t+=s[j][k];
P[ppc]+=(cnt[t]++);
}
}D[4]=P[4];
D[3]=P[3]-4*D[4];
D[2]=P[2]-3*D[3]-6*D[4];
D[1]=P[1]-2*D[2]-3*D[3]-4*D[4];
if(d==4) cout<<n*(n-1)/2-D[1]-D[2]-D[3]-D[4]<<'\n';
else cout<<D[4-d]<<'\n';
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?