nyoj 290 动物统计加强版(字典树)
点击打开链接
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAX 26
char str[15],s[15];
int max;
struct Trie
{
struct Trie *next[MAX];
int flag;
};
struct Trie *root;
struct Trie *newset()
{
struct Trie *p;
int i;
p=(Trie *)malloc(sizeof(Trie));
for(i=0;i<26;i++)
p->next[i]=NULL;
p->flag=0;
return p;
}
void insert(char *str)
{
struct Trie *p;
int length,i;
length=strlen(str);
p=root;
for(i=0;i<length;i++)
{
if(p->next[str[i]-'a']==NULL)
p->next[str[i]-'a']=newset();
p=p->next[str[i]-'a'];
}
p->flag++;
if(p->flag>max)
{
max=p->flag;
strcpy(s,str);
}
}
int main()
{
int n,i;
root=newset();
scanf("%d",&n);
max=0;
while(n--)
{
scanf("%s",str);
insert(str);
}
printf("%s %d\n",s,max);
return 0;
}
hdu 1671 Phone List 点击打开链接
电话本,注意释放内存;
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAX 11
char str[15],s[15];
int max,flags;
struct Trie
{
struct Trie *next[MAX];
int flag;
};
struct Trie *root;
struct Trie *newset()
{
struct Trie *p;
int i;
p=(Trie *)malloc(sizeof(Trie));
for(i=0;i<MAX;i++)
p->next[i]=NULL;
p->flag=0;
return p;
}
void insert(char *str)
{
struct Trie *p;
int length,i;
length=strlen(str);
p=root;
for(i=0;i<length;i++)
{
if(p->next[str[i]-'0']==NULL)
{
p->next[str[i]-'0']=newset();
}
if(p->flag)
flags=1;
p=p->next[str[i]-'0'];
}
p->flag++;
for(i=0;i<MAX;i++)
{
if(p->next[i]!=NULL)
{
flags=1;
}
}
}
int deal(struct Trie *T)
{ //这是把T清空,一开始没加这个,结果MLE
int i;
if(T==NULL)
return 0;
for(i=0;i<MAX;i++)
{
if(T->next[i]!=NULL)
deal(T->next[i]);
}
free(T);
return 0;
}
int main()
{
int n,t;
scanf("%d",&t);
while(t--)
{
root=newset();
scanf("%d",&n);
flags=0;
while(n--)
{
scanf("%s",str);
insert(str);
}
if(flags)
printf("NO\n");
else
printf("YES\n");
deal(root);
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAX 26
char str[15],s[15];
int max;
struct Trie
{
struct Trie *next[MAX];
int flag;
};
struct Trie *root;
struct Trie *newset()
{
struct Trie *p;
int i;
p=(Trie *)malloc(sizeof(Trie));
for(i=0;i<26;i++)
p->next[i]=NULL;
p->flag=0;
return p;
}
void insert(char *str)
{
struct Trie *p;
int length,i;
length=strlen(str);
p=root;
for(i=0;i<length;i++)
{
if(p->next[str[i]-'a']==NULL)
p->next[str[i]-'a']=newset();
p=p->next[str[i]-'a'];
}
p->flag++;
if(p->flag>max)
{
max=p->flag;
strcpy(s,str);
}
}
int main()
{
int n,i;
root=newset();
scanf("%d",&n);
max=0;
while(n--)
{
scanf("%s",str);
insert(str);
}
printf("%s %d\n",s,max);
return 0;
}
hdu 1671 Phone List 点击打开链接
电话本,注意释放内存;
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAX 11
char str[15],s[15];
int max,flags;
struct Trie
{
struct Trie *next[MAX];
int flag;
};
struct Trie *root;
struct Trie *newset()
{
struct Trie *p;
int i;
p=(Trie *)malloc(sizeof(Trie));
for(i=0;i<MAX;i++)
p->next[i]=NULL;
p->flag=0;
return p;
}
void insert(char *str)
{
struct Trie *p;
int length,i;
length=strlen(str);
p=root;
for(i=0;i<length;i++)
{
if(p->next[str[i]-'0']==NULL)
{
p->next[str[i]-'0']=newset();
}
if(p->flag)
flags=1;
p=p->next[str[i]-'0'];
}
p->flag++;
for(i=0;i<MAX;i++)
{
if(p->next[i]!=NULL)
{
flags=1;
}
}
}
int deal(struct Trie *T)
{ //这是把T清空,一开始没加这个,结果MLE
int i;
if(T==NULL)
return 0;
for(i=0;i<MAX;i++)
{
if(T->next[i]!=NULL)
deal(T->next[i]);
}
free(T);
return 0;
}
int main()
{
int n,t;
scanf("%d",&t);
while(t--)
{
root=newset();
scanf("%d",&n);
flags=0;
while(n--)
{
scanf("%s",str);
insert(str);
}
if(flags)
printf("NO\n");
else
printf("YES\n");
deal(root);
}
return 0;
}