1. 程式人生 > >HDU 1800 Flying to the Mars

HDU 1800 Flying to the Mars

分類

HDU 字典樹

題意

求出數字出現最多的次數。當n=0時,輸出1.

樣例輸入輸出

Sample Input

4
10
20
30
04
5
2
3
4
3
4

Sample Output

1
2

想法

(字典樹,涉及到高階資料結構)
每一個數字最長30位,用longlong也沒用,所以要用字串儲存,自然想到了字典樹,當然還有其他解法,map(時間勉強過),雜湊(不會)
注意:題目中說000123和123是一個數字,即要除去前導的0,稍作處理即可

程式碼

280ms

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib> #include<cstring> #define maxn 11111 using namespace std; struct Trie{ int ch[maxn][10]; int val[maxn]; int sz;//結點個數 Trie(){ sz = 1; memset(ch[0],0,sizeof(ch[0])); memset(val,0,sizeof(val)); } int idx(char c){ return c - '0'; } int insert(char* s){ int u=
0 , n= strlen(s); int j=0; while(s[j]=='0')j++; for(int i=j;i<n;i++){ int c = idx(s[i]); if(!ch[u][c])//結點不存在 { memset(ch[sz],0,sizeof(ch[sz])); ch[u][c] = sz++; } u = ch[u][c]; } val[u]++; return val[u]; } }; int main() { int n,mmax; char str[44]; while(~scanf(
"%d",&n)){ Trie T; mmax = 0; while(n--){ scanf("%s",str); int t = T.insert(str); mmax= max(mmax,t); } if(mmax == 0) mmax = 1; printf("%d\n",mmax); } return 0; }