【题解】Tree-String Problem Codeforces 291E AC自动机
Prelude
传送到Codeforces:(/ω\)……… (/ω•\)
Solution
很水的一道题。
对查询的串建出来AC自动机,然后树上随便跑跑就行了。
为什么要写这篇题解呢?
我第一眼看到这个题:“哈哈,有根树上的路径信息查询,点分治就好了,被我秒啦!”
“这个题好像是某Qualification Round的题啊。。。怎么Qual就出点分治啊,真毒瘤。”
然后码码码。。。
“怎么TLE了,卡卡常。”
卡常ing。。。
“怎么又WA了,难道卡哈希?毒瘤毒瘤。”
debugging。。。
“算了调不出来了拿tourist的代码拍一下吧。”
“这场比赛怎么AK了三百个人啊?这题怎么代码这么短啊?”
“。。。似乎KMP然后dfs一下就没了。。。我简直药丸。。。”
然后事实证明KMP的复杂度是错的,很容易就卡掉了,卡的方法也很简单,大家自己想想吧。。。
如果用KMP的话是TLE on test 30,如果是比赛就直接FST了。。。
所以用AC自动机就没问题了喵~
Code
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
const int MAXN = 400010;
int _w;
int n, ch[MAXN], m;
char str[MAXN];
namespace G {
int head[MAXN], nxt[MAXN], to[MAXN], eid;
void init() {
eid = 0;
memset(head, -1, sizeof head);
}
void adde( int u, int v ) {
to[eid] = v, nxt[eid] = head[u], head[u] = eid++;
}
}
void add_edge( int u, int v, char *str ) {
for( char *p = str; *p; ++p ) {
ch[++m] = *p - 'a';
if( p == str ) G::adde(u, m);
else G::adde(m-1, m);
}
G::adde(m, v);
}
namespace AC {
int ch[MAXN][26], nid;
bool word[MAXN];
queue<int> q;
int f[MAXN];
void insert( char *s ) {
int u = 0;
for( ; *s; ++s ) {
int c = *s - 'a';
if( !ch[u][c] )
ch[u][c] = ++nid;
u = ch[u][c];
}
word[u] = 1;
}
void build() {
for( int i = 0; i < 26; ++i )
if( ch[0][i] )
q.push( ch[0][i] );
while( !q.empty() ) {
int u = q.front(); q.pop();
for( int i = 0; i < 26; ++i ) {
int v = ch[u][i];
if( !v ) {
ch[u][i] = ch[f[u]][i];
continue;
}
int w = f[u];
while( w && !ch[w][i] ) w = f[w];
f[v] = ch[w][i];
q.push(v);
}
}
}
}
int ans;
void solve( int u, int o ) {
using namespace G;
if( ch[u] != -1 ) {
o = AC::ch[o][ch[u]];
if( AC::word[o] ) ++ans;
}
for( int i = head[u]; ~i; i = nxt[i] )
solve( to[i], o );
}
int main() {
_w = scanf( "%d", &n );
m = n;
G::init();
for( int i = 2; i <= n; ++i ) {
int pa;
_w = scanf( "%d%s", &pa, str );
add_edge(pa, i, str);
}
for( int i = 1; i <= n; ++i )
ch[i] = -1;
_w = scanf( "%s", str );
AC::insert(str);
AC::build();
solve(1, 0);
printf( "%d\n", ans );
return 0;
}
【题解】Tree-String Problem Codeforces 291E AC自动机的更多相关文章
- 【题解】P3796【模板】AC自动机(加强版)
[题解]P3796 [模板]AC自动机(加强版) 记录当前\(cnt\)是第几个"星".记录第几个串是对应着第几个星. 这里补充一点对于\(AC\)自动机的理解.可能一直有个问题我 ...
- Codeforces 710F - String Set Queries(AC 自动机)
题面传送门 题意:强制在线的 AC 自动机. \(n,\sum|s|\leq 3\times 10^5\) 如果不是强制在线那此题就是道 sb 题,加了强制在线就不那么 sb 了. 这里介绍两种做法: ...
- Searching the String - ZOJ 3228(ac自动机)
题目大意:首先给你一下母串,长度不超过10^5,然后有 N(10^5) 次查询,每次查询有两种命令,0或者1,然后加一个子串,询问母串里面有多少个子串,0表示可以重复,1表示不可以重复. 分析:发 ...
- AC 自动机学习笔记
虽然 NOIp 原地爆炸了,目前进入 AFO 状态,但感觉省选还是要冲一把,所以现在又来开始颓字符串辣 首先先复习一个很早很早就学过但忘记的算法--自动 AC AC自动机. AC 自动机能够在 \(\ ...
- AC自动机模板2(【CJOJ1435】)
题面 Description 对,这就是裸的AC自动机. 要求:在规定时间内统计出模版字符串在文本中出现的次数. Input 第一行:模版字符串的个数N. 第2->N+1行:N个字符串.(每个模 ...
- 洛谷P2444 病毒【AC自动机】
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1195 题意概括 给出一堆串,然后求一个包含这些串的所有串的最短的中的字典序最小的. 题解 先造一个AC ...
- 【poj2778-DNA Sequence】AC自动机+矩阵乘法
题意: (只含AGCT)给定m个病毒串,让你构造一个长度为n的字符串(也只含有AGCT),问有多少种方案.n很大:1<=n<=2000000000 题解: 用病毒串建立AC自动机(num个 ...
- Trie树&kmp&AC自动机&后缀数组&Manacher
Trie 计数+Trie,读清题意很重要 https://vjudge.net/problem/UVALive-5913 kmp AC自动机 模板:https://vjudge.net/problem ...
随机推荐
- centos下部署禅道流程
原文摘录:https://www.jianshu.com/p/71e9dab130a5 下面将我在Linux系统下搭建禅道服务的过程分享给大家. 第一步:下载禅道 Linux中可以用以下命令来下载安装 ...
- java读取properties文件的几种方法
一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取 Properties p=new Properties(); ...
- Unity3D游戏开发——物品存储:List与Dictionary
本篇简介 本文介绍如何将碰撞处理后的物体存储在管理器中,分别用到两种不同的数据结构--List和Dictionary.我们将继续在上一篇博客的编程基础上进行完善. List和Dictionary的区别 ...
- ns3 回调机制
(1)目的:为了实现两个模块之间的通信(这两个模块没有任何依赖关系) (2) C语言中的函数指针 int (*a)(int q) = 0; //声明一个函数指针a,初始值设为0 //. //. //. ...
- C++获取private的变量-偷走private
private提供了对数据的封装,使得private成员只能被类自身的成员函数以及类的友元访问,其他的函数或者类想要访问private成员只能通过该类所提供的set和get的方法进行访问, 或者返回其 ...
- 个人作业-Week 2
一.代码复审 概要部分 代码能符合需求和规格说明么? 能: 代码设计是否有周全的考虑? 有较为周全的考虑: 代码可读性如何? 可读性一般: 代码容易维护么? 不太容易维护: 代码的每一行都执行并检查过 ...
- angular入门学习文档之一
一.数据双向绑定 angular(下面统一简称ng)强大的地方莫过于它内置的数据双向绑定功能,下面我们通过一个简单的例子来演示ng强大的双向绑定数据的能力. 代码如下: 1.dom结构: 1.< ...
- [转]正确设置nginx/php-fpm/apache权限
核心总结:php-fpm/apache 进程所使用的用户,不能是网站文件所有者. 凡是违背这个原则,则不符合最小权限原则. 根据生产环境不断反馈,发现不断有 php网站被挂木马,绝大部分原因是因为权限 ...
- Tomcat 启动流程
- Java开发中的23种设计模式详解(转载)
前学习过一段时间的设计模式,总是感觉学习的不够清楚.现在再重新复习一下,原文地址:https://blog.csdn.net/doymm2008/article/details/13288067 一. ...