题意:
给n排字符每排k个个字符,k个字符只包含三种字母 S E T,这三种字符代表三个特征,每排可以当作一张卡片,三张卡片组成的特殊形式可以成一套,特殊形式是三张卡片的每一列要么全不同,要么全相同,问n排卡片,从中选择卡片最多能有多少种选择
题解:
这道题可以构造答案从而降低复杂度,我还是太菜了,打cf打的太少,从而对于这种思路性的题一点想法都没。如何构造,很简单,我们只需要根据两张卡片的特征去构造第三张卡片即可,这样枚举的复杂度只有
O(n^2)
,当我们构造出答案,看给定的序列中存在不存在即可,我们只需要统计每张卡片出现的次数即可,我对map的用法不太会,这里也了解了一下
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e3+5;
string str[maxn];
map<string,int>mp;
//构造
int main()
{
int n,k;
scanf("%d %d",&n,&k);
int S='S'+'T'+'E';
for(int i=0;i<n;i++)
{
cin>>str[i];
mp[str[i]]++;
}
int ans=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
string s;
for(int o=0;o<k;o++)
{
if(str[i][o]==str[j][o])
{
s+=str[i][o];
}
else
{
s+=S-str[i][o]-str[j][o];
}
}
ans+=mp[s];
}
}
printf("%d\n",ans/3);
}