Trie树学习记录

真的不能再拒绝字符串算法的学习,先从Trie树学起吧。。。

COGS 词链,裸题,建出Trie树后遍历一遍,比较根到每个叶子节点的单词个数,取最大值;code:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct trie_node{
	char letter;
	int sum; bool f;
	trie_node *next[26];
	trie_node(char letter): letter(letter) {int i;for (i=0;i<=25;++i) next[i]=NULL; f=false; sum=0;}
};
trie_node *root;
char s[100];
char now[100];
int n,l;
void insert(trie_node *p,int i,int len)
{
	trie_node *temp;
	if (p->next[(int)(s[i])-97]==NULL)
	  {
	    temp=new trie_node(s[i]);
	    p->next[(int)(s[i])-97]=temp;
	    p=p->next[(int)(s[i])-97];
	  }
	else
	  p=p->next[(int)(s[i])-97];
	if (i==len-1)
	  {
	    p->f=true; p->sum++;
	    return;
	  }
	insert(p,i+1,len);
}
void count(trie_node *p)
{
	int i;
	if (p->f)
	  {
	    for (i=1;i<=l;++i)
	  	  printf("%c",now[i]);
	  	printf("%c ",p->letter);
	  	printf("%d\n",p->sum);
	  }
	for (i=0;i<=25;++i)
	  {
	    if (p->next[i])
	      {
	        if (p!=root)
	          {
	          	l++;
	            now[l]=p->letter;
	          }
			count(p->next[i]);
			if (p!=root)
			  l--;   
	      }
	  }
}
int main()
{
	int i,len;
	root=new trie_node(' ');
	scanf("%d",&n);
	for (i=1;i<=n;++i)
	  {
	    scanf("%s",&s);
	    len=strlen(s);
	    insert(root,0,len);
	  }
	l=0;
	count(root);
}
COGS 293 【NOI 2000】单词查找树

15年前的NOI题被各种乱虐,这个题大概可以和数字三角形一起哭死在墙角,code:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct trie_node{
	char letter;
	trie_node *next[26];
	trie_node(char letter): letter(letter) {int i; for(i=0;i<=25;++i) next[i]=NULL;}
};
int ans=0;
trie_node *root;
char str[100];
void insert(trie_node *p,int i,int len)
{
	trie_node *temp;
	if (i==len) return;
	if (p->next[(int)(str[i])-'A']==NULL)
	  {
	    temp=new trie_node(str[i]);
		p->next[(int)(str[i])-'A']=temp;
		p=p->next[(int)(str[i])-'A'];  
	  }
	else
	  p=p->next[(int)(str[i])-'A'];
	insert(p,i+1,len);
}
void count(trie_node *p)
{
	bool f; int i;
	ans++;
	for (i=0;i<=25;++i)
	  if (p->next[i]!=NULL)
	    count(p->next[i]);
}
int main()
{
	int len;
	root=new trie_node(' ');
	while (scanf("%s",&str)==1)
	  {
	    len=strlen(str);
	    insert(root,0,len);
	  }
	count(root);
	printf("%d\n",ans);
}
COGS 647 【Youdao2010】有道搜索框 

一道思路清晰但代码不是特别好写 code:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct trie_node{
	char letter;
	bool f; 
	trie_node *next[26];
	trie_node(char letter): letter(letter) {int i;for (i=0;i<=25;++i) next[i]=NULL; f=false;}
};
int n,t=0,m,l;
trie_node *root;
char now[5000];
char str[5000];
void insert(trie_node *p,int i,int len)
{
	trie_node *temp;
	if (p->next[(int)(str[i])-97]==NULL)
	  {
	    temp=new trie_node(str[i]);
	    p->next[(int)(str[i])-97]=temp;
	    p=p->next[(int)(str[i])-97];
	  }
	else
	  p=p->next[(int)(str[i])-97];
	if (i==len-1)
	  {
	    p->f=true;
	    return;
	  }
	insert(p,i+1,len);
}
bool work(trie_node *p,int i,int len)
{
	if (i==len) return true;
	if (p->next[(int)(str[i])-97]==NULL)
	  return false;
	else
	  work(p->next[(int)(str[i])-97],i+1,len);
}
void out(trie_node *p,int i,int len)
{
	int j;
	if (i<=len-1)
	  out(p->next[(int)(str[i])-97],i+1,len);
	if (i>=len)
	  {
	  	if (p->f&&t<8)
	      {
		    for (j=0;j<l;++j) 
		      cout<<now[j]; 
		    if (i!=len)
			  cout<<p->letter;
			cout<<' ';
			t++;
		  }
	    for (j=0;j<=25;++j)
	      {
	        if (p->next[j]!=NULL&&t<8)
	          {
	          	if (i>len)
	          	  {
	                now[l]=p->letter;
	                l++;
	              }
	            out(p->next[j],i+1,len);
	            if (i>len)
	              l--;
	          }
	      } 
	  }
}
int main()
{
	int i,len;
	root=new trie_node(' ');
	scanf("%d",&n);
	for (i=1;i<=n;++i)
	  {
	    scanf("%s",&str);
	    len=strlen(str);
	    insert(root,0,len);
	  }
	scanf("%d",&m);
	for (i=1;i<=m;++i)
	  {
	    scanf("%s",&str);
	    len=strlen(str);
	    if (!work(root,0,len))
	      printf("%s\n",str);
	    else
	      {strcpy(now,str); l=len; t=0; out(root,0,len); printf("\n");}
	  }
}

你可能感兴趣的:(Trie树学习记录)