【题解】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 ...
随机推荐
- 点击小图查看大图jQuery插件FancyBox魔幻灯箱
今日发现一个不错的JQuery插件FancyBox,也许早就有这个插件了,但是没名字,我就暂且叫他魔幻灯箱吧,采用Mac系统的样式.网传主要有以下功能:■弹出的窗口有很漂亮的阴影效果.■关联的对象(就 ...
- Final冲刺贡献分
小组名称:Hello World! 项目名称:空天猎 组长:陈建宇 成员:刘成志.刘耀泽.刘淑霞.黄泽宇.方铭.贾男男 一.贡献分数规则: (1)基础分:5 , 4 ,4 , 3 , 2 ,2 ,1. ...
- Ubuntu16.04下 编译安装 Tensorflow
安装bazel sudo ./bazel***.sh 输入bazel version 检查是否安装. 编译tensorflow 1)./configure 除了选择支持cuda是y,其余的都选择n. ...
- 炸弹人NABCD分析
团队项目NABCD分析结果 N(Need 需求):现在安卓手游比较热门,所以我们想要编写这样一款软件应用于学生,让学生可以在课余时间放松心情,缓解学习压力. A (Approach 做法):使用Coc ...
- 新手学ajax1
学习的动力是最近想实现servlet向js传值,是html中的js,因为jsp是可以直接调用java 类的,在网上搜索了好久感觉ajax能帮我实现. 以下代码可以实现js向服务器发出一 requ ...
- 可视化实时Web日志分析工具-goaccess
说到web服务器就不得不说Nginx,目前已成为企业建站的首选.但由于种种历史原因,Nginx日志分析工具相较于传统的apache.lighthttp等还是少很多. 今天就和大家分享一个非常强大的实时 ...
- SqlServer中的dbo是什么意思
出处:http://andylin02.iteye.com/blog/486296 SqlServer中的dbo是什么意思? DBO是每个数据库的默认用户,具有所有者权限,即DbOwner 通过用DB ...
- Java集合技巧
集合的一些技巧: 需要唯一吗? 需要:Set 需要制定顺序: 需要: TreeSet 不需要:HashSet 但是想要一个和存储一致的顺序(有序):LinkedHashSet 不需要:List ...
- windwon安装macaca环境
一 安装配置java 1.安装java_jdk ,安装过程中顺带一起安装jre (1)选择[新建系统变量]--弹出“新建系统变量”对话框,在“变量名”文本框输入“JAVA_HOME”,在“ ...
- 使用JavascriptExecutor将页面滚动到最底部
使用如下代码,将页面滚动到最底部 @Test(enabled = true) public void scroll(){ String jsStr="window.scrollTo(0,do ...