暂无链接
名称记录
【题目描述】
当奶牛们进入谷仓挤奶时,农民约翰一直保持他的奶牛详细记录。每一个小时,一组3头奶牛进入谷仓,农民约翰写下他们的名字。例如,在55个小时的时间,他会写下下面的列表,其中的每一行对应一组进入谷仓的牛:
BESSIE ELSIE MATILDA
FRAN BESSIE INGRID
BESSIE ELSIE MATILDA
MATILDA INGRID FRAN
ELSIE BESSIE MATILDA
农民约翰指出,相同的组可能几次出现在他的名单中;在上面的例子中,BESSIE, ELSIE, and MATILDA出现了三次(即使农民约翰不一定以相同的顺序写名称当每次他们进入谷仓)。
请帮助农民约翰计算最多进入谷仓的组。
【输入】
第11行,一个整数NN,农民约翰保持记录的次数 (1≤N≤1000)(1≤N≤1000)。
第2..1+N2..1+N行:每行包含用空格隔开的三个牛的名字。每一个的名字是11到1010个字符且只使用字母A-Z。
【输出】
一行,牛组最多进入谷仓出现次数。
【输入样例】
5
BESSIE ELSIE MATILDA
FRAN BESSIE INGRID
BESSIE ELSIE MATILDA
MATILDA INGRID FRAN
ELSIE BESSIE MATILDA
【输出样例】
3
【提示】
样例解释:
牛组{BESSIE, ELSIE, MATILDA}进入谷仓三次。
题解
名字长度、奶牛数都很水。。。
只需要基本的字符串哈希(转26进制,或者不用哈希直接strcmp都行),装到long long里。n还小于等于1000, O(n2) O ( n 2 ) 暴力枚举都能过(各位要用set或者更高级的哈希也是可以的)
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,x[1005][3];
ll hash(char c[])
{
int k=strlen(c);
ll r=0;
for(int i=0;i<k;++i)
r*=10,r+=c[i]-'A';
return r;
}
void in()
{
char c1[15],c2[15],c3[15];
scanf("%lld",&n);
for(int i=1;i<=n;++i)
{
scanf("%s%s%s",c1,c2,c3);
x[i][0]=hash(c1);
x[i][1]=hash(c2);
x[i][2]=hash(c3);
sort(x[i],x[i]+3);
}
}
void ac()
{
int maxn=0;
for(int i=1;i<=n;++i)
{
int ans=0;
for(int j=1;j<=n;++j)
if(x[i][0]==x[j][0]&&x[i][1]==x[j][1]&&x[i][2]==x[j][2])
ans++;
maxn=max(maxn,ans);
}
printf("%d",maxn);
}
int main()
{
in();ac();
return 0;
}