正解: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自动机的更多相关文章

  1. 洛谷 - P3966 - 单词 - AC自动机

    https://www.luogu.org/problemnew/show/P3966 因为文本串就是字典本身,所以这个和平时的AC自动机不太一样.平时的query要沿着fail树把子树的出现次数依次 ...

  2. 洛谷-P5357-【模板】AC自动机(二次加强版)

    题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...

  3. 洛谷P2444 病毒【AC自动机】

    题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...

  4. 洛谷P2444 病毒 [POI2000] AC自动机

    正解:AC自动机 解题报告: 传送门! 首先看到这种题目二话不说先把trie树和fail指针建立起来 然后就想鸭,如果我们想让模式串和文本串尽量不能匹配,就要想办法让它跳fail指针,而不是继续往下走 ...

  5. 洛谷2414(构建ac自动机fail树dfs序后遍历Trie树维护bit及询问答案)

    要点 这是一道蔡队题,看我标题行事 任意询问y串上有多少个x串,暴力找每个节点是不是结尾肯定是炸的,考虑本质:如果某节点是x的结尾,根据ac自动机的性质,x一定是此(子)串后缀.又有每个Trie节点的 ...

  6. 洛谷-P3796-【模板】AC自动机(加强版)

    题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,在fail边的基础上再加一个last边, ...

  7. 【洛谷 P3966】 [TJOI2013]单词(AC自动机,差分)

    把单词连起来,中间插入间隔符,同 #include <cstdio> #include <queue> #include <cstring> using names ...

  8. 洛谷.3808/3796.[模板]AC自动机

    题目链接:简单版,增强版 简单版: #include <cstdio> #include <cstring> const int N=1e6+5,S=26; char s[N] ...

  9. 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)

    点此看题面 大致题意: 给你\(N\)个单词,请你求出每一个单词在这\(N\)个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. \(AC\)自动机 这是一道\(AC\)自动机的简 ...

随机推荐

  1. Linux 上安装oracle客户端

    1. 下载安装包 http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html oracle-instantclient11 ...

  2. [Ubuntu] geoip-bin 程序包 - 查询 IP 归属地

    简述:在Linux命令行下查询IP归属地. 对Ubuntu/Debian系统,使用APT命令进行安装: $ sudo apt-get install geoip-bin 该包由MaxMind提供,它同 ...

  3. 《利用Python 进行数据分析》 - 笔记(4)----json

    解决方案: 读写文本格式的数据: pandas 提供了一些用于将表格型数据读取为DataFrame对象的函数 pandas 中的解析函数 函数的选项可以划分为以下几个大类 索引:将一个或多个列当做返回 ...

  4. nodeJs学习过程之认识nodejs

    nodeJs只是听说过,没见过,没玩过.从新手开始,我想慢慢掌握它. 一.首先,我想知道nodeJs是什么? 摘自百度百科: Node.js是一套用来编写高性能网络服务器的JavaScript工具包, ...

  5. Objective-C官方文档 值和集合

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 尽管Objective-c是一个面向对象的语言,是C语言的超集,这意味着你可以用任何标准的C标量(非对象)像int,float,和char在Obje ...

  6. css笔记 - 张鑫旭css课程笔记之 absolute 篇

    absolute地址 absolute绝对定位 绝对定位与浮动鲜为人知的兄弟关系 即是说,absolute后,元素和浮动元素的特性差不多,只不过absolute脱离文档流,元素飘在天上,float还在 ...

  7. bootstrap 中这段代码 使bundles 失败

    _:-ms-fullscreen, :root input[type="date"], _:-ms-fullscreen, :root input[type="time& ...

  8. jquery 元素选择器集合

    一.基本选择器 1. id选择器(指定id元素) 将id="one"的元素背景色设置为黑色.(id选择器返单个元素) $(document).ready(function () { ...

  9. WebApp与Native App有何区别

    转:http://blog.sina.com.cn/s/blog_5f2df1e401018hjj.html 今天看的一篇关于html5的Web App与Native App的技术分析,真的很棒分享一 ...

  10. gradle-4.1-all.zip

    1. https://services.gradle.org/distributions/ https://services.gradle.org/distributions/gradle-4.1-a ...