Poll

时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
We have N voting papers. The i-th vote (1≤i≤N) has the string Si written on it.
Print all strings that are written on the most number of votes, in lexicographical order.

Constraints
·1≤N≤2×10^5
·Si (1≤i≤N) are strings consisting of lowercase English letters.
·The length of Si (1≤i≤N) is between 1 and 10 (inclusive).
输入
Input is given from Standard Input in the following format:

N
S1
:
SN

输出
Print all strings in question in lexicographical order.
样例输入 Copy
【样例1】

7
beat
vet
beet
bed
vet
bet
beet

【样例2】

8
buffalo
buffalo
buffalo
buffalo
buffalo
buffalo
buffalo
buffalo

【样例3】

7
bass
bass
kick
kick
bass
kick
kick

【样例4】

4
ushi
tapu
nichia
kun

样例输出 Copy
【样例1】

beet
vet

【样例2】

buffalo

【样例3】

kick

【样例4】

kun
nichia
tapu
ushi

提示
样例1解释
beet and vet are written on two sheets each, while beat, bed, and bet are written on one vote each. Thus, we should print the strings beet and vet.
题目大意是按字典序输出出现次数最多的字符串,结合题目的数据量,我们可以考虑快排,然后两次遍历,第一次找出现的最大次数,第二次找出现最大次数的字符串。
这个题目有几个容易出错的地方。
一是如果用string类的话,快排的代码很简单,直接上sort函数就完事,但是输入、输出string类字符串要用cin、cout,此题的数据量会TLE。
二是换成字符数组利用scanf输入后,需要注意快速排序中自定义cmp函数的返回值。我们需要按字符串的字典序排列,因此在cmp函数中要实现字典序小的放在前面。根据二维字符数组的特点,不能写成return *(char*)a-*(char*)b;,正确的写法是return strcmp((char*)a,(char*)b),这里的(char*)a,(char*)b相当于s[i],s[j]

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int cmp(const void*a,const void*b)
{
    return strcmp((char*)a,(char*)b);
}
char s[200005][15];
int main()
{
    int n;
    int i;
    int cnt;
    int mmax;
    scanf("%d",&n);
    for(i=0;i<=n-1;i++)
    {
        scanf("%s",s[i]);
    }
    qsort(s,n,sizeof(s[0]),cmp);
    cnt=1;
    mmax=-1;
    for(i=0;i<=n-2;i++)
    {
        if(strcmp(s[i],s[i+1])==0)
        {
            cnt++;
        }
        else
        {
            mmax=max(cnt,mmax);
            cnt=1;
        }
    }
    mmax=max(cnt,mmax);
    cnt=1;
    for(i=0;i<=n-2;i++)
    {
        if(strcmp(s[i],s[i+1])==0)
        {
            cnt++;
        }
        else
        {
            if(cnt==mmax)puts(s[i]);
            cnt=1;
        }
    }
    if(cnt==mmax)puts(s[n-1]);
    return 0;
}
/**************************************************************
    Language: C++
    Result: 正确
    Time:100 ms
    Memory:6980 kb
****************************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值