标签:字典树

4 10 20 30 04 5 2 3 4 3 4
1 2
题意:求数列中出现最多的数的个数,但是需要之一的是熟的长度有30,以前居然int水过,现在用字典树写了一遍
需要注意的是要删除内存,不然会超的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
typedef __int64 ll;
#define fre(i,a,b)  for(i = a; i < b; i++)
#define free(i,b,a) for(i = b; i >= a;i--)
#define mem(t, v)   memset ((t) , v, sizeof(t))
#define ssf(n)      scanf("%s", n)
#define sf(n)       scanf("%d", &n)
#define sff(a,b)    scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf          printf
#define bug         pf("Hi\n")
using namespace std;
#define INF 0x3f3f3f3f
#define N 10
struct stud{
  int num;
  stud * next[N];
  //void he(){num=0;for(int i=0;i<N;i++) next[i]=NULL;}
}*root;
int ans;
void insert(char *c)
{
	stud *p=root;
	while(*c)
	{
		if(p->next[*c-'0']==NULL)
			{
				stud *t=(stud *)malloc(sizeof(stud));
				for(int i=0;i<N;i++)
					t->next[i]=NULL;
				t->num=0;
			    p->next[*c-'0']=t;
			    p=t;
			}
        else p=p->next[*c-'0'];
	 c++;
	}
    p->num++;
    ans=max(p->num,ans);
}
void delet(stud* temp)
{
     int i;
     if(temp==NULL) return ;
     for(i=0;i<N;i++)
		if(temp->next[i]!=NULL)
		  delet(temp->next[i]);
	 delete(temp);
}
int main()
{
   int i,j;
   char ch[35];
   int n;
   while(~scanf("%d",&n))
   {
   	 root=(stud *)malloc(sizeof(stud));
   	 for(i=0;i<N;i++)
		root->next[i]=NULL;
	root->num=0;
	ans=0;
	 while(n--)
	 {
	 	scanf("%s",ch);
	 	for(i=0;ch[i];i++)
			if(ch[i]!='0') break;
		insert(ch+i);
	 }
      printf("%d\n",ans);
      delet(root);
   }
  return 0;
}
HDU 1800 Flying to the Mars(字典树)
标签:字典树
原文地址:http://blog.csdn.net/u014737310/article/details/45587643