一道简单的贪心题目,看着题目的数据,可能需要高精度,又要写比较什么的,干趣另求它法。
由于每个数字不超过30digit,果断使用字符串hash, elfhash+闭散列处理
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXCHAR 40
#define MAXN 7003
int hash[MAXN];
char save[MAXN][MAXCHAR], tmp[MAXCHAR];
inline int elf_hash(const char *str)
{
unsigned long h( 0L ), x( 0L );
strcpy(tmp, str);
while( *str ) {
h = (h<<4)+(*str ++);
if( (x = h&0xF0000000L) ) {
h ^= (x>>24); h &= ~x;
}
}
int idx = h%MAXN;
while( hash[idx] && strcmp(tmp, save[idx]) ) {
idx = (idx+1)%MAXN;
}
strcpy(save[idx], tmp); return idx;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int n, rst;
char *ptr, str[MAXCHAR];
while( ~scanf("%d", &n ) ) { rst = 0;
memset(hash, 0, sizeof(hash)); memset(save, '\0', sizeof(save));
for(int i = 0; i < n; i ++) {
scanf("%s", str); ptr = str;
while( '0' == *ptr ) { ptr ++; }
rst = max(rst, ++ hash[ elf_hash(ptr) ]);
}
printf("%d\n", rst);
}
return 0;
}