时间限制: 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
****************************************************************/