洛谷P3966 单词 [TJOI2013] AC自动机
正解:AC自动机
解题报告:
先来提供一个40pts错解QAQ
首先看到这题就会想到AC自动机板子题2鸭!然后就照着那题的套路打一下,随便改一点儿,简单来说就是每次经过一个节点都要++,然后每搜到一个节点就暴跳所有fail,tr[fail].as+=tr[nw].as
然后你就能得到40pts的好成绩,,,另外60pts还是WA的,,,就很难过,,,
#include<bits/stdc++.h>
using namespace std;
#define ll int
#define rp(i,x,y) for(register ll i=x;i<=y;++i) const ll N=+,M=+;
ll n,cnt,as,ed[M];
struct tre{ll as,nxt[],fail;tre(){as=;memset(nxt,,sizeof(nxt));fail=;}}tr[N];
bool gdgs=; inline ll read()
{
register char ch=getchar();register ll x=;register bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=getchar();
if(ch=='-')ch=getchar(),y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
}
inline void bd(ll nm)
{
string str;cin>>str;ll lth=str.length()-,nw=;
rp(i,,lth)
{
if(tr[nw].nxt[str[i]-'a'+]==)tr[nw].nxt[str[i]-'a'+]=++cnt;
nw=tr[nw].nxt[str[i]-'a'+];++tr[nw].as;
}
ed[nm]=nw;
}
inline void fl()
{
queue<ll>Q;
rp(i,,)if(tr[].nxt[i])Q.push(tr[].nxt[i]);
while(!Q.empty())
{
ll nw=Q.front();Q.pop();
rp(i,,)
{
if(tr[nw].nxt[i])tr[tr[nw].nxt[i]].fail=tr[tr[nw].fail].nxt[i],Q.push(tr[nw].nxt[i]);
else tr[nw].nxt[i]=tr[tr[nw].fail].nxt[i];
}
}
}
inline void zdj()
{
rp(i,,cnt)
{
// printf("i=%d as=%d\n",i,tr[i].as);
for(register ll j=i;j;j=tr[j].fail)tr[tr[j].fail].as+=tr[i].as/*,printf("j=%d fl=%d\n",j,tr[j].fail)*/;
}
} int main()
{
n=read();rp(i,,n)bd(i);fl();tr[].fail=;zdj();//printf("QAQ?\n");
rp(i,,n)printf("%d\n",tr[ed[i]].as);
return ;
}
放下sd灵巧的sd代码呜呜呜
研究辣半天回来repo一下我错哪儿辣,,,我好像是打挂辣呜呜呜
不过还是有个点有问题
就是,暴跳会T
可以在配fail的时候记录下bfs序,然后直接按bfs倒叙序每次就只有这个点的fail要跳辣而不是所有的fail都要跳一遍
然后就over辣!
话说为什么这题居然有紫,,,?病毒都比这题难一些啊我jio得,,,?
等下放代码QAQ
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rg register
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i) const ll N=+,M=+;
ll n,cnt,as,ed[M],que[N],tmp;
struct tre{ll as,nxt[],fail;tre(){as=;memset(nxt,,sizeof(nxt));fail=;}}tr[N]; inline ll read()
{
rg char ch=getchar();rg ll x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=getchar();
if(ch=='-')ch=getchar(),y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
}
inline void bd(ll nm)
{
string str;cin>>str;ll lth=str.length()-,nw=;
rp(i,,lth)
{
if(!tr[nw].nxt[str[i]-'a'+])tr[nw].nxt[str[i]-'a'+]=++cnt;
nw=tr[nw].nxt[str[i]-'a'+];++tr[nw].as;
}
ed[nm]=nw;
}
inline void fl()
{
queue<ll>Q;
rp(i,,)if(tr[].nxt[i])Q.push(tr[].nxt[i]),que[++tmp]=tr[].nxt[i];
while(!Q.empty())
{
ll nw=Q.front();Q.pop();
rp(i,,)
{
if(tr[nw].nxt[i])tr[tr[nw].nxt[i]].fail=tr[tr[nw].fail].nxt[i],Q.push(tr[nw].nxt[i]),que[++tmp]=tr[nw].nxt[i];
else tr[nw].nxt[i]=tr[tr[nw].fail].nxt[i];
}
}
} int main()
{
// freopen("cjkcjk.in","r",stdin);
// freopen("cjkcjk.out","w",stdout);
n=read();rp(i,,n)bd(i);fl();tr[].fail=;my(i,tmp,)tr[tr[que[i]].fail].as+=tr[que[i]].as;
rp(i,,n)printf("%lld\n",tr[ed[i]].as);
return ;
}
这儿是代码吼!
洛谷P3966 单词 [TJOI2013] AC自动机的更多相关文章
- 洛谷 - P3966 - 单词 - AC自动机
https://www.luogu.org/problemnew/show/P3966 因为文本串就是字典本身,所以这个和平时的AC自动机不太一样.平时的query要沿着fail树把子树的出现次数依次 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 洛谷P2444 病毒【AC自动机】
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- 洛谷P2444 病毒 [POI2000] AC自动机
正解:AC自动机 解题报告: 传送门! 首先看到这种题目二话不说先把trie树和fail指针建立起来 然后就想鸭,如果我们想让模式串和文本串尽量不能匹配,就要想办法让它跳fail指针,而不是继续往下走 ...
- 洛谷2414(构建ac自动机fail树dfs序后遍历Trie树维护bit及询问答案)
要点 这是一道蔡队题,看我标题行事 任意询问y串上有多少个x串,暴力找每个节点是不是结尾肯定是炸的,考虑本质:如果某节点是x的结尾,根据ac自动机的性质,x一定是此(子)串后缀.又有每个Trie节点的 ...
- 洛谷-P3796-【模板】AC自动机(加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,在fail边的基础上再加一个last边, ...
- 【洛谷 P3966】 [TJOI2013]单词(AC自动机,差分)
把单词连起来,中间插入间隔符,同 #include <cstdio> #include <queue> #include <cstring> using names ...
- 洛谷.3808/3796.[模板]AC自动机
题目链接:简单版,增强版 简单版: #include <cstdio> #include <cstring> const int N=1e6+5,S=26; char s[N] ...
- 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)
点此看题面 大致题意: 给你\(N\)个单词,请你求出每一个单词在这\(N\)个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. \(AC\)自动机 这是一道\(AC\)自动机的简 ...
随机推荐
- PHP代码审计笔记--命令执行漏洞
命令执行漏洞,用户通过浏览器在远程服务器上执行任意系统命令,严格意义上,与代码执行漏洞还是有一定的区别. 0x01漏洞实例 例1: <?php $target=$_REQUEST['ip']; ...
- jenkins配置RF构建结果显示
声明:转载请注明出处,谢谢 步骤1:安装robot framework plugin插件:系统管理-管理插件 步骤2:设置构建后操作:job-配置-构建后操作增加“Publish Robot Fram ...
- 剑指offer面试题6:重建二叉树
1.题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. public class Solution { public TreeNode reConstructBinaryTree(int ...
- 这样理解 HTTPS 更容易(Maybe)
摘要:本文尝试一步步还原HTTPS的设计过程,以理解为什么HTTPS最终会是这副模样.但是这并不代表HTTPS的真实设计过程.在阅读本文时,你可以尝试放下已有的对HTTPS的理解,这样更利于“还原”过 ...
- C# GIF图片的分解以及合成
dll下载的地址 http://www.codeproject.com/Articles/11505/NGif-Animated-GIF-Encoder-for-NET 使用主要调用的是Compo ...
- 【Spring系列】Spring AOP面向切面编程
前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...
- 如何使用 Flexbox 和 CSS Grid,实现高效布局
CSS 浮动属性一直是网站上排列元素的主要方法之一,但是当实现复杂布局时,这种方法不总是那么理想.幸运的是,在现代网页设计时代,使用 Flexbox 和 CSS Grid 来对齐元素,变得相对容易起来 ...
- python tkinter学习——布局
目录 一.pack() 二.grid() 三.place() 四.Frame() 正文 布局 一.pack() pack()有以下几个常用属性: side padx pady ipadx ipady ...
- svn版本管理
代码发布方案: 1,安装,优化 软件环境,(nginx,lvs) <-------运维工程师 2,程序代码(不断更新). <--------开发工程师,(开发,运维都可以发布) 3, ...
- vue实现按需加载(懒加载)
1.router文件中使用 export default new Router({ routes: [{ path: '/', name: 'Post', component: () => im ...