#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();
}
}
字典树Trie经典模板
于 2024-05-11 11:08:17 首次发布