洛谷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\)自动机的简 ...
随机推荐
- Python学习--判断变量的数据类型
import types aaa = 0 print type(aaa) if type(aaa) is types.IntType: print "the type of aaa is i ...
- SpringBoot(十三)-- 不同环境下读取不同配置
一.场景: 在开发过程中 会使用 开发的一套数据库,测试的时候 又会使用测试的数据库,生产环境中 又会切换到生产环境中.常用的方式是 注释掉一些配置,然后释放一下配置.SpringBoot提供了在不同 ...
- Android的Fragment中onActivityResult不被调用
1.检查该Fragment所属的Activity中,是否重写了onActivityResult方法. 2.检查Fragment中的startActivityForResult的调用方式. 请确保不要使 ...
- sutdio中替换全局方法
Ctril Shift R Text to find :是要搜索的内容或者要被替换的内容 Replace with :是要替换的内容 Preview:是可以看到预览 在Scope的选项卡里 Whole ...
- 微信小程序的wx-charts插件
还有就是可以使用一些小程序的插件,比如wx-charts. 先来看一下网上对这个插件的评价: 目前在github上有1804颗星,使用的比较广泛. github地址:https://github.co ...
- 【转载】经典.net面试题目【为了笔试。。。。。】
. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成员 ...
- 【vue基础学习】vue.js开发环境搭建
1.安装node.js(http://www.runoob.com/nodejs/nodejs-install-setup.html) 2.基于node.js,利用淘宝npm镜像安装相关依赖 在cmd ...
- wex5 onactive不执行的解决办法
由index.w点击某个图片,转到adetail,希望每次adetail加载时,取到参数id index.w <tbody class="x-list-template" x ...
- goldengate 过滤对某张表的复制操作
在复制进程中配置下面的参数可以实现对一个用户下的某些表进行过滤,在复制的时候 不做任何操作. MAPEXCLUDE: Valid for Replicat Use the MAPEXCLUDE par ...
- 题目1102:最小面积子矩阵(暴力求解&最大连续子序列)
题目链接:http://ac.jobdu.com/problem.php?pid=1102 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...