hdu 1004 Let the Balloon Rise(trie||映射统计)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1004
给出一定数量的字符串,求出出现次数最多的字符串。
统计字符串可以用字典树,我用trie做运行了15MS。

#include <iostream>
#include<cstdio>
using namespace std;
typedef struct node{
   int num;
   bool fin;
   struct node *next[26];
}*trie,node; //*trie: yeah, get new technology
trie root;
void init(trie &p){
   p=new node();
   for(int i=0;i<26;i++)p->next[i]=0;
   p->fin=0;
   p->num=0;
}
void insert(trie p,char s[]){
   int i=0;
   while(s[i]){
       if(p->next[s[i]-97]==0){
           trie q;
           init(q);
           p->next[s[i]-97]=q;
       }
       p=p->next[s[i]-97];
       p->num++;
       i++;
   }
   p->fin=1;
}
int find(trie p,char s[]){
   int k=0;
   while(s[k]&&p->next[s[k]-97]){
       p=p->next[s[k]-97];
       k++;
   }
   if(s[k]==0)return p->num;
   return 0;
}
int main()
{
    //freopen("cin.txt","r",stdin);
    int n;
    while(cin>>n&&n){
        init(root); 
        char str[1005][20];
        for(int i=0;i<n;i++){
            scanf("%s",str[i]);
            insert(root,str[i]);
        }
        int maxn=0,tmp,dex;
        for(int i=0;i<n;i++){
            tmp=find(root,str[i]);
            if(tmp>maxn){
                maxn=tmp;
                dex=i;
            }
        }
        printf("%s\n",str[dex]);
    }
    return 0;
}

但是这里也可以用标记法做。我用map将字符串和出现的次数构成映射关系,最后统计即可。这种方法运行时间更短,显示0MS。

#include <iostream>
#include<cstdio>
#include<map>
#include<string>
using namespace std;

int main()
{
    //freopen("cin.txt","r",stdin);
    int n;
    while(cin>>n&&n){
        map<string,int> mp;
        for(int i=0;i<n;i++){
            string s;
            cin>>s;
            mp[s]++;
        }
        int maxn=0;
        map<string,int>::iterator dex,ix=mp.begin();
        for(;ix!=mp.end();ix++){
             if(maxn<ix->second){
                maxn=ix->second;
                dex=ix;
             }
        }
        cout<<dex->first<<endl;
    }
    return 0;
}



你可能感兴趣的:(数据结构,HDU)