Flying to the Mars
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 16049 Accepted Submission(s): 5154
Problem Description
Input
Input file contains multiple test cases. In a test case,the first line contains a single positive number N indicating the number of soldiers.(0<=N<=3000) Next N lines :There is only one nonnegative integer on each line , indicating the level number for each soldier.( less than 30 digits);
Output
For each case, output the minimum number of broomsticks on a single line.
Sample Input
4
10 20 30 04
5
2 3 4 3 4
Sample Output
1
2
Author
PPF@JLU
题目大意:给你n个数,让你判断出现最多的那个数字的次数是多少。由于所给数字有几十位,long long也存不下。所以采用Hash记录每个数,同时记录次数。 由于所给的n个数会有00001这种带前缀0的数据,所以要先处理一下。
#include#include #include #include using namespace std;const int maxn = 1e4+200;struct Chain{ char st[200]; int tm; Chain *next; Chain(){ tm = 0; next = NULL; } ~Chain(){ }}Hash_Table[maxn];int ans;//BKDRint Hash(char *s){ unsigned int seed = 131; //13,131,1313 13131 131313 unsigned int v_hash = 0; while(*s == '0'){ ++s; } while(*s){ v_hash = v_hash * seed + (*s++); } return (v_hash & 0x7fffffff);}void Insert(Chain *rt, char *s){ while(*s == '0') s++; printf("%s\n",s); while(rt -> next != NULL){ rt = rt->next; if(strcmp(rt->st,s)==0){ rt->tm++; ans = max(ans,rt->tm); return ; } } rt->next = new Chain(); rt = rt->next; rt->next = NULL; strcpy(rt->st,s); rt->tm++; ans = max(ans,1);}void Free(Chain * rt){ if(rt->next != NULL) Free(rt->next); { delete rt; }}int main(){ char s[maxn]; int n, m; unsigned int H; while(scanf("%d",&n)!=EOF){ ans = 0; for(int i = 1; i <= n; ++i){ scanf("%s",s); H = Hash(s)%2911; // printf("%u+++++++++++\n",H); Insert(&Hash_Table[H],s); } printf("%d\n",ans); for(int i = 0; i <= 3200; i++){ if(Hash_Table[i].next == NULL) continue; Free(Hash_Table[i].next); Hash_Table[i].next = NULL; } } return 0;}/*50000001000000141000100001011*/