[USACO DEC13] 名称记录

79 篇文章 1 订阅
12 篇文章 0 订阅

暂无链接

名称记录

【题目描述】

当奶牛们进入谷仓挤奶时,农民约翰一直保持他的奶牛详细记录。每一个小时,一组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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值