poj2001~自己种的第一颗字典树Trie!

本文详细介绍了字典树的裸实现,包括构建过程和查找功能,通过实例代码展示如何利用字典树进行字符串匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很裸的Trie!注意数组开大点就好了

#include<iostream>
#include<string>
using namespace std;
#define MAX 27

char str[10001][25];

typedef struct Trie     //字典树
{
	Trie *next[MAX];  //这个看最多有几个字符,
	int v;          //作为前缀的次数
};

Trie *root;

void insertTrie(char *str) //构建字典树
{
	int len=strlen(str);
	Trie *p=root,*q;        
	
	for(int i=0;i<len;i++)
	{
		int id=str[i]-'a';
		
		if(p->next[id]==NULL)
		{
				
			q=new Trie;        //新节点q的创立
			q->v=1;
			for(int j=0;j<MAX;++j)
				q->next[j]=NULL;

			p->next[id]=q;
			p=p->next[id];
				
		}
		else 
		{
			p->next[id]->v++;
			p=p->next[id];
		}
	}
}

int findTrie(char *str)
{
	int len=strlen(str),ans;
	Trie *p=root;
	for(int i=0;i<len;i++)
	{
		int id=str[i]-'a';
		p=p->next[id];
		if(p->v==1)      //如果发现这个前缀只出现过一次,就返回这个点
		{return i;}
	}
	return len-1;   //如果遍历完了都没发现只出现过一次的前缀,返回最后一个点
}
int main()
{
	int t,i,j;
	t=0;
	root=new Trie;       //构建根节点!这个很重要,不然会报错
	for(i=0;i<MAX;i++)
		root->next[i]=NULL;

	while(scanf("%s",str[t])!=EOF)
	{
		insertTrie(str[t]);
		t++;
	}
	for(i=0;i<t;i++)
	{
		printf("%s ",str[i]);
		str[i][ findTrie(str[i]) +1]='\0';
		cout<<str[i]<<endl;
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值