[BZOJ 3172] [Tjoi2013] 单词 【AC自动机】
题目链接:BZOJ - 3172
题目分析:
题目要求求出每个单词出现的次数,如果把每个单词都在AC自动机里直接跑一遍,复杂度会很高。
这里使用AC自动机的“副产品”——Fail树,Fail树的一个性质是,一个字符串出现的次数,就等于以它的结点为根的Fail树中的子树中所有结点的 Cnt 和。
所以把每个单词插入的时候每个字符都 ++Cnt ,在建 Fail 的时候将结点依次压入一个栈,最后再从栈顶开始弹栈,更新栈顶元素的 Fail 的 Cnt 值,这样就是自叶子节点向上更新了。
我开始写的时候出现的错误:建 Fail 的时候漏掉了 if (Now -> Child[i] == NULL) Now -> Child[i] = Now -> Fail -> Child[i]; 这句。这样会 RE !
代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; const int MaxN = 200 + 5, MaxL = 1000000 + 5, MaxC = 26; int n, l; char Str[MaxL]; struct Trie
{
int Cnt;
Trie *Fail, *Child[MaxC];
void clear() {
Cnt = 0;
Fail = NULL;
for (int i = 0; i < 26; ++i) Child[i] = NULL;
}
} TA[MaxL], *P = TA, *Root, *Zero, *Pos[MaxN]; Trie *NewNode() {
++P;
P -> clear();
return P;
} void AC_Init() {
Zero = NewNode();
Root = NewNode();
Root -> Fail = Zero;
for (int i = 0; i < 26; ++i) Zero -> Child[i] = Root;
} Trie *Insert(char *Str, int l) {
Trie *Now = Root;
int t;
for (int i = 0; i < l; ++i) {
t = Str[i] - 'a';
if (Now -> Child[t] == NULL) Now -> Child[t] = NewNode();
Now = Now -> Child[t];
++(Now -> Cnt);
}
return Now;
} Trie *Q[MaxL], *S[MaxL];
int Head, Tail, Top; void Build_Fail() {
Top = 0;
Head = Tail = 0;
Q[++Tail] = Root;
Trie *Now;
while (Head < Tail) {
Now = Q[++Head];
S[++Top] = Now;
for (int i = 0; i < 26; ++i) {
if (Now -> Child[i] == NULL) Now -> Child[i] = Now -> Fail -> Child[i];
else {
Now -> Child[i] -> Fail = Now -> Fail -> Child[i];
Q[++Tail] = Now -> Child[i];
}
}
}
while (Top) {
Now = S[Top--];
if (Now -> Fail != NULL)
(Now -> Fail -> Cnt) += (Now -> Cnt);
}
} int main()
{
scanf("%d", &n);
AC_Init();
for (int i = 1; i <= n; ++i) {
scanf("%s", Str);
l = strlen(Str);
Pos[i] = Insert(Str, l);
}
Build_Fail();
for (int i = 1; i <= n; ++i) printf("%d\n", Pos[i] -> Cnt);
return 0;
}
[BZOJ 3172] [Tjoi2013] 单词 【AC自动机】的更多相关文章
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ...
- bzoj 3172: [Tjoi2013]单词 AC自动机
3172: [Tjoi2013]单词 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 3172 [Tjoi2013]单词 AC自动机Fail树
题目链接:[http://www.lydsy.com/JudgeOnline/problem.php?id=3172] 题意:给出一个文章的所有单词,然后找出每个单词在文章中出现的次数,单词用标点符号 ...
- BZOJ 3172 [Tjoi2013]单词 AC自己主动机(fail树)
题意:链接 方法:AC自己主动机与fail树性质 解析:复习AC自己主动机的第一道题?(真正的第一题明明是又一次写了遍hdu2222! ) 这题说实话第一眼看上去就是个sb题,仅仅要建出来自己主动机. ...
- BZOJ 3172([Tjoi2013]单词-后缀数组第一题+RMQ)
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 268 Solved: 145 [ Submit][ St ...
- 【BZOJ 3172】[Tjoi2013]单词 AC自动机
关于AC自动机:一个在kmp与Trie的基础上建立的数据结构,关键在于Trie树结构与fail指针,他们各有各的应用.在AC自动机里最典型的就是多串匹配,原本效率为O(n*l+n*l+m*l),(n是 ...
- bzoj 3172: [Tjoi2013]单词【AC自动机】
一眼AC自动机,就是先把串建一个自动机,标记每个串在自动机上的位置,然后加上间隔符连成一个串在自动机上跑,每跑到一个点就说明这个串以及它到root的所有点表示的串都要被更新一次 先在点上打上标记,最后 ...
- 【BZOJ3172】[Tjoi2013]单词 AC自动机
[BZOJ3172][Tjoi2013]单词 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input ...
- bzoj 3172 [Tjoi2013]单词(fail树,DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3172 [题意] 题目的意思是这样的,给若干个单词,求每个单词在这一堆单词中的出现次数. ...
随机推荐
- 接口作为参数,不同的接口调用不同的方法,例如:输出“I love Game”或输出“我喜欢游戏”
接口的思想:在于可以增加很多类都需要实现的功能.比如:各式各样的商品,可能隶属不同公司,但工商部门都必须具有显示商标的功能(实现同一接口).商标的具体制作由各个公司自己去实现. 给其他类去实现,不同的 ...
- windows下 tomcat7 配置成服务
最简单方法:下载windows安装版,下一步下一步搞定! 非安装版: 1.下载tomcat7 windows版 2.首先找到F:\apache\bin\service.bat(不同的计算机Tomcat ...
- 如何优化cocos2d程序的内存使用和程序大小:第一部分_(转)
译者: 在我完成第一个游戏项目的时候,我深切地意识到“使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰”.而我刚开始接触cocos2d的时候,社区里面的人们讨论了一个 ...
- 全栈project师?给把瑞士军刀你去砍鬼子好不好!?
来自www.techgogogo.com 编者注:本文来自Medium前三名推荐文章,发文时已经获得高达2,125个推荐,中文版由天地会珠海分舵编译.全文对当今风靡业界的"全栈xx师&quo ...
- Python获取当前时间 分类: python 2014-11-08 19:02 132人阅读 评论(0) 收藏
Python有专门的time模块可以供调用. <span style="font-size:14px;">import time print time.time()&l ...
- [Flux] 1. Development Environment Setup
Install packages: { "name": "reactflux", "version": "1.0.0", ...
- [RxJS] Aggregating Streams With Reduce And Scan using RxJS
What is the RxJS equivalent of Array reduce? What if I want to emit my reduced or aggregated value a ...
- 亲测PHpnow 安装环境
出现问题1: "C:\Windows\system32\7z.exe"' 不是 或批处理文件. 找不到 C:\Windows\system32\7z.exe------------ ...
- docker入门(一)
docker安装 yum install -y docker-io [root@centos ~]# yum install -y docker-io 已加载插件:fastestmirror, lan ...
- [转] 整理了一份React-Native学习指南
自己在学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull requests! React-Native学习指南 本指南汇集React ...