A
Time Limit: 60ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给出n(1<= n && n <= 2*10^6)个字符串,每个字符串只包含小写英文字母,且最多有五个。问这n个字符串中出现次数最多的有多少个。
输入
单组输入。第一行输入一个数字n,接下来n行,每行包含一个字符串。
输出
输出一个数字代表答案。
示例输入
5 aba abb w aba z
示例输出
2
提示
来源
示例程序
字典树暂时敲不出来,就只能暴力解决了。
用快排超10ms 果断不用了。
刚做的时候以为用哈希加暴力不靠谱,会超时。没想到优化一下就好了。真是太棒了!!!!!!!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char a[2000001][6];
int sum[10000000];
/*int cmp(const void *a,const void *b)
{
return *(int*)b - *(int*)a;
}*/
int main()
{
int n,i,j,t;
memset(sum,0,sizeof(sum));
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",&a[i]);
int m,kk = 0;
m = strlen(a[i]);
t = 1;
for(j=0;j<m;j++)
{
kk = kk + a[i][j]*t;
t = t*100;
}
sum[kk]++;
}
//qsort(sum,10000000,sizeof(sum[0]),cmp);
int max = 0;
for(i=0;i<1000000;i++)
{
if(sum[i]>max)
{
max = sum[i];
}
}
printf("%d\n",max);
return 0;
}
#include<string.h>
#include<stdlib.h>
char a[2000001][6];
int sum[10000000];
/*int cmp(const void *a,const void *b)
{
return *(int*)b - *(int*)a;
}*/
int main()
{
int n,i,j,t;
memset(sum,0,sizeof(sum));
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",&a[i]);
int m,kk = 0;
m = strlen(a[i]);
t = 1;
for(j=0;j<m;j++)
{
kk = kk + a[i][j]*t;
t = t*100;
}
sum[kk]++;
}
//qsort(sum,10000000,sizeof(sum[0]),cmp);
int max = 0;
for(i=0;i<1000000;i++)
{
if(sum[i]>max)
{
max = sum[i];
}
}
printf("%d\n",max);
return 0;
}