字典树Trie经典模板

#include<bits/stdc++.h>//字典树经典模版
using namespace std;
typedef long long ll;
const int N=205556;
ll trie[N][26],idx=1,tail[N];//一般ll,结点数量会很多 
//idx是节点编号,从1(根节点)
//end[i]是标记有没有以i(节点)结尾的字符串
//trie[i][26],是(节点)i处的分支,全小写就26个(0-25)
//如果大小写加数字,26要变大,同时要映射出来 
void insert(string s)
{
	int len=s.size(),p=0;//(根结点);
	for(int i=0;i<len;i++)
	{
		int u=s[i]-'a';//小写[0-25]
		//int u=s[i]-'A'+26//大写[26,51]
		//int u=s[i]-'0'+52//数字[52,51]
		//以上是字符串同时出现大小写,数字时的一个映射
		//同时修改trie[N][52]多多益善
		if(trie[p][u]==0)//在p(当前节点)没有字符u的分支 
		{
			trie[p][u]=idx++;//就创建一个新节点 
		}
		p=trie[p][u];//移到那个字符u的映射节点 
	}
	tail[p]=1;//标记结尾 
}
bool ask(string s)
{
	int len=s.size(),p=0;
	for(int i=0;i<len;i++)
	{
		int u=s[i]-'a';
		p=trie[p][u];
		if(p==0)//不存在结点就说明没有此字符串 
		{
			return false; 
		}
	}
	return tail[p];
}
void solve()
{
	
}
int main()
{
	int t=1;
	//cin>>t;
	while(t--)
	{
		solve();
	}
}

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值