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

  1. 【题解】P3796【模板】AC自动机(加强版)

    [题解]P3796 [模板]AC自动机(加强版) 记录当前\(cnt\)是第几个"星".记录第几个串是对应着第几个星. 这里补充一点对于\(AC\)自动机的理解.可能一直有个问题我 ...

  2. Codeforces 710F - String Set Queries(AC 自动机)

    题面传送门 题意:强制在线的 AC 自动机. \(n,\sum|s|\leq 3\times 10^5\) 如果不是强制在线那此题就是道 sb 题,加了强制在线就不那么 sb 了. 这里介绍两种做法: ...

  3. Searching the String - ZOJ 3228(ac自动机)

    题目大意:首先给你一下母串,长度不超过10^5,然后有 N(10^5) 次查询,每次查询有两种命令,0或者1,然后加一个子串,询问母串里面有多少个子串,0表示可以重复,1表示不可以重复.   分析:发 ...

  4. AC 自动机学习笔记

    虽然 NOIp 原地爆炸了,目前进入 AFO 状态,但感觉省选还是要冲一把,所以现在又来开始颓字符串辣 首先先复习一个很早很早就学过但忘记的算法--自动 AC AC自动机. AC 自动机能够在 \(\ ...

  5. AC自动机模板2(【CJOJ1435】)

    题面 Description 对,这就是裸的AC自动机. 要求:在规定时间内统计出模版字符串在文本中出现的次数. Input 第一行:模版字符串的个数N. 第2->N+1行:N个字符串.(每个模 ...

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

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

  7. BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1195 题意概括 给出一堆串,然后求一个包含这些串的所有串的最短的中的字典序最小的. 题解 先造一个AC ...

  8. 【poj2778-DNA Sequence】AC自动机+矩阵乘法

    题意: (只含AGCT)给定m个病毒串,让你构造一个长度为n的字符串(也只含有AGCT),问有多少种方案.n很大:1<=n<=2000000000 题解: 用病毒串建立AC自动机(num个 ...

  9. Trie树&kmp&AC自动机&后缀数组&Manacher

    Trie 计数+Trie,读清题意很重要 https://vjudge.net/problem/UVALive-5913 kmp AC自动机 模板:https://vjudge.net/problem ...

随机推荐

  1. 【Oracle】存储过程在字符串单引号'内拼接单引号'

    http://blog.csdn.net/u011704894/article/details/44976557 一般变量里面接3个单引号 eg: 'DELETE FROM RDM_SUPP_DATA ...

  2. Bing词典vs有道词典比对测试报告——体验篇之软件适应性

    联网情况: 在联网情况下,针对每一次查询,有道词典的反应速度明显比必应词典快得多.据我推测有以下两个原因: 有道词典有本地词库而必应词典更多依赖联网. 有道词典的服务器在国内而必应的在国外. 断网情况 ...

  3. 【Alpha发布】贡献分分配

    最后贡献分分配: (1211)王嘉豪:32 (1186)黄雨萌:36 (1182)佘彦廷:40 (1208)何小松:50 (1200)鲁聃:62 (1174)邢浩:64 (1193)刘乾:66

  4. Sprint11

    进展:基本设置和显示已经完成,然后是可以通过长按事件弹出对话框可以进行停用.修改.取消该事件提醒的实现,通过触发动作跳转到各个部分页面.

  5. 生命周期事件和 Global.asax 文件

    文章:IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述 该文章有介绍Application_Start方法

  6. contos7忘记root密码怎么办

    首先在这个界面按"e"键 然后呢就会进入到如下图所示的界面,在LANG=zh_CN.UTF8的后面加上 init=/bin/sh, 再按 [ Ctrl + X ] 进入'单用户模式 ...

  7. https 的理解

    前言: 本篇博文来记录下对http及https的理解.(会有点 杂,补缺补漏) 引用:https://blog.csdn.net/u011109589/article/details/80306479 ...

  8. 『编程题全队』Alpha 阶段冲刺博客Day4

    1.每日站立式会议 1.会议照片 2.昨天已完成的工作统计 孙志威: 1.添加团队界面下的看板容器SlotWidget 2.实现SlotWidgets的动态布局管理 3.实现团队/个人界面之间的切换 ...

  9. 【第十周】psp

    代码累计 300+575+475+353+620+703=2926 随笔字数 1700+3000+3785+4210+4333+3032=20727 知识点 机器学习,支持向量机 数据库技术 Acm刷 ...

  10. PAT 1074 宇宙无敌加法器

    https://pintia.cn/problem-sets/994805260223102976/problems/994805263297527808 地球人习惯使用十进制数,并且默认一个数字的每 ...