Trie图(模板)
2024-08-31 14:23:30
Trie图(蒟蒻听说AC自动机能做的题Trie图都能做,而且AC自动机可能被卡,就没学过AC自动机),最近想捡一捡,好久之前做的了。
Trie图,就是一个在Trie树上建的图 大概描述一下
比如说有几个字符串:
abc
abcd
bcd
bacd
jdr
ac
先把它们存在Trie树中:
就像KMP那样,做出这样的逻辑判断:
bacd比较到第三位bac结果没有d,但起码bac有了,所以以bac为前缀的或以bac后缀为前缀的串是不用再比较前缀了。
所以出现了fail指针,为失配情况重新定位方案。
类似于next数组。
无解(定位不到失配后新方案),就指向根表示无解。
显而易见,首字母失配是一定没有方案的。
其次,一个字母失配可以定位到父节点失配的自己值子节点。
一个优化:没有新子节点的节点直接指向fail指针自己值子节点。
建出来Trie图是这样的:
匹配时类似KMP:
模板代码(luogu P3808 【模板】AC自动机(简单版)):
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
struct trnt{
int ch[];
int val;
int fl;
}tr[];
std::queue<int>Q;
char tmp[];
int siz;
int n;
void add(char *a)
{
int len=strlen(a+);
int root=;
for(int i=;i<=len;i++)
{
int c=a[i]-'a';
if(!tr[root].ch[c])
tr[root].ch[c]=++siz;
root=tr[root].ch[c];
}
tr[root].val++;
}
void Build()
{
int root=;
for(int i=;i<;i++)
if(tr[root].ch[i])
Q.push(tr[root].ch[i]);
while(!Q.empty())
{
root=Q.front();
Q.pop();
for(int i=;i<;i++)
{
if(tr[root].ch[i])
{
tr[tr[root].ch[i]].fl=tr[tr[root].fl].ch[i];
Q.push(tr[root].ch[i]);
}else
tr[root].ch[i]=tr[tr[root].fl].ch[i];
}
}
return ;
}
int Cal(char *a)
{
int len=strlen(a+);
int ans=;
int root=;
for(int i=;i<=len;i++)
{
int c=a[i]-'a';
root=tr[root].ch[c];
for(int j=root;j&&(tr[j].val!=-);j=tr[j].fl)
{
ans+=tr[j].val;
tr[j].val=-;
}
}
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s",tmp+);
add(tmp);
}
Build();
scanf("%s",tmp+);
printf("%d\n",Cal(tmp));
return ;
}
最新文章
- 我是如何在SQLServer中处理每天四亿三千万记录的
- ORM小结
- 鼠标滑过图片变暗文字链接滑出jQuery特效
- 20135202闫佳歆--week 8 课本第4章学习笔记
- HDU3930 (原根)
- Android Studio AVD和SDK Manager灰色不能点击的问题。
- thinkphp操作数据库
- 【转】MongoDB资料汇总专题
- uva-442 Matrix Chain Multiplication
- SQL Select结果增加自增自段(网转)
- 安装hexo报错(npm WARN deprecated swig@1.4.2: This package is no longer maintained),已解决
- IndentationError : expected an indented block
- [BZOJ]4199: [Noi2015]品酒大会(后缀数组+笛卡尔树)
- JAVA 创建对象4种方法
- 登录获取token,token参数关联至所有请求的请求体内
- linux统计使用最多的10个命令
- canvas-4fillstyle.html
- ​《数据库系统概念》1-数据抽象、模型及SQL
- boost--smart_ptr库
- ActiveRecord::Fixture::FixtureError: table ";users"; has no column named ";activated_at";.