HDU 1800 Flying to the Mars
阿新 • • 發佈:2018-12-22
分類
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;
}