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 ;
}

最新文章

  1. 我是如何在SQLServer中处理每天四亿三千万记录的
  2. ORM小结
  3. 鼠标滑过图片变暗文字链接滑出jQuery特效
  4. 20135202闫佳歆--week 8 课本第4章学习笔记
  5. HDU3930 (原根)
  6. Android Studio AVD和SDK Manager灰色不能点击的问题。
  7. thinkphp操作数据库
  8. 【转】MongoDB资料汇总专题
  9. uva-442 Matrix Chain Multiplication
  10. SQL Select结果增加自增自段(网转)
  11. 安装hexo报错(npm WARN deprecated swig@1.4.2: This package is no longer maintained),已解决
  12. IndentationError : expected an indented block
  13. [BZOJ]4199: [Noi2015]品酒大会(后缀数组+笛卡尔树)
  14. JAVA 创建对象4种方法
  15. 登录获取token,token参数关联至所有请求的请求体内
  16. linux统计使用最多的10个命令
  17. canvas-4fillstyle.html
  18. ​《数据库系统概念》1-数据抽象、模型及SQL
  19. boost--smart_ptr库
  20. ActiveRecord::Fixture::FixtureError: table &quot;users&quot; has no column named &quot;activated_at&quot;.

热门文章

  1. thinkphp5内置标签
  2. POJ 1895 分层图网络流+输出路径
  3. TYVJ 1935 拆点网络流
  4. BZOJ 3940 AC自动机
  5. POJ 3622 multiset
  6. Hue的三大特点、三大功能和架构
  7. C#一些延时函数
  8. ES6学习笔记(九)Set和Map数据结构
  9. tee---将数据重定向到文件,
  10. win7安装python开发环境,执行python