B. Hyperset
题意:给定n个长度为k的字符串由’S’‘E’'T’组成,三个为一组要求相同位置字符一样/完全不同为一套,求最大的套数。
给定的n为1500,k为30,直接暴力必然tle。可以枚举两个然后确定第三个的字符,放到map里找是否存在,最后ans/3
string s[maxn];
int main(){
int n,m;
cin>>n>>m;
map<string,int> mp;
for(int i=1;i<=n;i++){
cin>>s[i];
mp[s[i]]++;
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
string t;
for(int l=0;l<m;l++){
if(s[i][l]==s[j][l])
t+=s[i][l];
else
t+='S'+'E'+'T'-s[i][l]-s[j][l];//确定第三个字符串
}
if(mp[t])
ans++;
}
}
cout<<ans/3<<endl;
return 0;
}