博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3172:[TJOI2013]单词——题解
阅读量:6206 次
发布时间:2019-06-21

本文共 1214 字,大约阅读时间需要 4 分钟。

某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。

fail树的棵题。

朴素想法就是建立AC自动机,每个串都匹配一遍,这样显然TLE。

但是实际上我们就是相当于查询一个单词x在另一个单词y内出现了多少次。

对于上面这个问题,一种朴素想法是AC自动机,把y单词的所有结点的fail都跑一遍,看看有没有指向x末尾的,有答案++。

其实我们只用到了fail指针,所以不如我们把fail提出来重新建树,减少状态。

令cnt[i]为0~i的路径拼起来字符串出现次数。

这样我们建立了fail树,从下往上累加cnt即可,最终答案就是查询单词的末尾记录的cnt。

我们因为只进行了一次dfs,比之前查询n次的效率显然高到不知道哪里去了。

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int N=220;const int S=1e6+5;inline int read(){ int X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch=='-';ch=getchar();} while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X;}struct trie{ int a[26],fail;}tr[S];struct node{ int to,nxt;}e[S];int m,tot,cnt[S],ed[N],sum,head[S];char s[S];queue
q;inline void add(int u,int v){ e[++sum].to=v;e[sum].nxt=head[u];head[u]=sum;}void insert(int id){ int len=strlen(s),now=0; for(int i=0;i

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客: +

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8997360.html

你可能感兴趣的文章
CSS一些最佳实践
查看>>
详解 Discuz 的 PHP经典加密解密函数 authcode
查看>>
nginx 是如何处理访问请求的
查看>>
使用curl命令查看访问url的时间
查看>>
WinForm中跨线程操作控件
查看>>
下MFC中对象、句柄、ID之间的区别.
查看>>
如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)
查看>>
Flymeos插桩适配教程
查看>>
还在用PS磨皮去皱?看看如何用神经网络高度还原你的年轻容貌!
查看>>
大端模式与小端模式、网络字节顺序与主机字节顺序
查看>>
微信支付申请90%的商户都卡在这儿了,申请微信支付,商户功能设置详细说明...
查看>>
高仿Instagram 页面效果android特效
查看>>
我的友情链接
查看>>
如何查找JSP页面中的错误
查看>>
2016 年总结
查看>>
将String转化成Stream,将Stream转换成String
查看>>
java路径Java开发中获得非Web项目的当前项目路径
查看>>
Google API设计指南-资源名称
查看>>
最全React技术栈技术资料汇总(收藏)
查看>>
【工具使用系列】关于 MATLAB 遗传算法与直接搜索工具箱,你需要知道的事
查看>>