传送门
写在前面:昨天交的,忘写题解了……
思路:如果想练习fail树,这道题是个不错的选择,AC自动机一通操作(insert时对每个经过的节点的sum++)后反向建fail树,然后对它dfs,把子节点的sum逐渐累加上来,最后每个字符串对应的AC自动机上的节点的sum就是答案
注意:fail树单向建边,记录每个字符串对应的结束节点
代码:

#include<bits/stdc++.h>
using namespace std;
int n,root=1,tot=1,id;
int sum[1000010],first[1000010],num[202],trie[1000010][26],fail[1000010];
char s[1000010];
queue<int>q;
struct edge
{int u,v,next;
}e[1000010];
void insert(int id,char s[])
{int now=root,len=strlen(s);for (int i=0;i<len;i++){if (!trie[now][s[i]-'a']) trie[now][s[i]-'a']=++tot;now=trie[now][s[i]-'a'];sum[now]++;}num[id]=now;
}
void build()
{int now,tmp;q.push(root);while (!q.empty()){now=q.front();q.pop();for (int i=0;i<26;i++)if (trie[now][i]){tmp=fail[now];while(tmp&&!trie[tmp][i]) tmp=fail[tmp];if (now!=root&&tmp) fail[trie[now][i]]=trie[tmp][i];else fail[trie[now][i]]=root;q.push(trie[now][i]);}}
}
void add(int x,int y)
{e[++id].u=x;e[id].v=y;e[id].next=first[x];first[x]=id;
}
void dfs(int x)
{for (int i=first[x];i;i=e[i].next)dfs(e[i].v),sum[x]+=sum[e[i].v];
}
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%s",s),insert(i,s);build();for (int i=2;i<=tot;i++)add(fail[i],i);dfs(root);for (int i=1;i<=n;i++) printf("%d\n",sum[num[i]]);
}

【BZOJ3172】单词,AC自动机练习相关推荐

  1. bzoj 3172: [Tjoi2013]单词 AC自动机

    3172: [Tjoi2013]单词 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  2. BZOJ3172 TJOI2013 单词 AC自动机

    题意:给定N个字符串,设S为N个字符串首尾相连组成的字符串,查询每个字符串在S中出现的次数. 题解: 首先我们在构造Trie的时候,将构造过程中经过的节点的cnt全部++,此时cnt中记录该模式串被多 ...

  3. 1285. 单词 ac自动机 + fail树

    传送门 文章目录 题意: 思路: 题意: 一篇论文由若干单词构成,且单词间是隔开的,给你nnn个单词,要求你计算每个单词在论文中出现了多少次. 1≤n≤2001\le n\le 2001≤n≤200, ...

  4. luogu_3966【题解】单词 AC自动机

    题面:https://www.luogu.org/problemnew/show/P3966 大意:小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次, ...

  5. 【BZOJ3172】单词(AC自动机)

    [BZOJ3172]单词(AC自动机) 题面 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input ...

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

    点此看题面 大致题意: 给你NNN个单词,请你求出每一个单词在这NNN个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. LinkLinkLink [洛谷3796][模板]AC自动 ...

  7. 数单词 (AC自动机模板题)

    数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...

  8. HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)

    背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...

  9. NYOJ 1085 数单词 (AC自动机模板题)

    数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...

最新文章

  1. A股光刻胶飙涨背后:仅一家可供应高端光刻胶
  2. Android 4.2.2原生Launcher修改使之可以运行过程小结
  3. 使用ORACLE生成文本文件
  4. java集合系列之18 spring boot程序员的必修课
  5. JVM之堆Heap参数调优入门
  6. 微信改成右滑删除_手机文件数据恢复,怎样恢复已过期的微信附件呢?
  7. iOS NSString 与NSData转化
  8. PHP群发300万,mysql 300万数据查询500多秒如何优化
  9. Kotlin学习笔记 第二章 类与对象 第十节 内部类嵌套类
  10. 苹果Mac Finder 替代工具:Path Finder
  11. modelsim10.6c安装教程
  12. win10创建新的计算机用户名和密码,win10电脑怎么新建用户?高手教你在win10新建用户的方法...
  13. iOS 关于音乐锁屏控制音乐(锁屏信息设置)
  14. 量子点太阳能电池《一》
  15. 309.Best Time to Buy and Sell Stock with Cooldown
  16. serial port not selected
  17. 什么是MTTF、MTBF、MTTR?
  18. [MakeFile教程-09] 隐含规则
  19. c语言单片机定时器的应用程序,51单片机定时器中断程序(C语言)
  20. 教你如何爬取某哪儿网酒店数据

热门文章

  1. ZZ:SDNLAB技术分享(一):ODL的SFC入门和Demo
  2. 一统江湖的大前端(7)React.js-从开发者到工程师
  3. HDFS的操作SHELL和API
  4. Android 笔记 android 7.0 单独编译framwork不生效的解决
  5. m1芯片MacBook安装Apple优化版TensorFlow(虚拟环境)
  6. poj 2236 WirelessNetwork 并查集
  7. centos7 运行 jar_centos7两行命令就部署了服务器测试环境?(java)
  8. zookeeper3.5.x版本启动报错java.io.IOException: No snapshot found, but there are log entries.解决
  9. CUDA中并行规约(Parallel Reduction)的优化
  10. Python练习:整数加减和