【题解】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 ...
 
随机推荐
- 【Oracle】存储过程在字符串单引号'内拼接单引号'
			
http://blog.csdn.net/u011704894/article/details/44976557 一般变量里面接3个单引号 eg: 'DELETE FROM RDM_SUPP_DATA ...
 - Bing词典vs有道词典比对测试报告——体验篇之软件适应性
			
联网情况: 在联网情况下,针对每一次查询,有道词典的反应速度明显比必应词典快得多.据我推测有以下两个原因: 有道词典有本地词库而必应词典更多依赖联网. 有道词典的服务器在国内而必应的在国外. 断网情况 ...
 - 【Alpha发布】贡献分分配
			
最后贡献分分配: (1211)王嘉豪:32 (1186)黄雨萌:36 (1182)佘彦廷:40 (1208)何小松:50 (1200)鲁聃:62 (1174)邢浩:64 (1193)刘乾:66
 - Sprint11
			
进展:基本设置和显示已经完成,然后是可以通过长按事件弹出对话框可以进行停用.修改.取消该事件提醒的实现,通过触发动作跳转到各个部分页面.
 - 生命周期事件和 Global.asax 文件
			
文章:IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述 该文章有介绍Application_Start方法
 - contos7忘记root密码怎么办
			
首先在这个界面按"e"键 然后呢就会进入到如下图所示的界面,在LANG=zh_CN.UTF8的后面加上 init=/bin/sh, 再按 [ Ctrl + X ] 进入'单用户模式 ...
 - https 的理解
			
前言: 本篇博文来记录下对http及https的理解.(会有点 杂,补缺补漏) 引用:https://blog.csdn.net/u011109589/article/details/80306479 ...
 - 『编程题全队』Alpha 阶段冲刺博客Day4
			
1.每日站立式会议 1.会议照片 2.昨天已完成的工作统计 孙志威: 1.添加团队界面下的看板容器SlotWidget 2.实现SlotWidgets的动态布局管理 3.实现团队/个人界面之间的切换 ...
 - 【第十周】psp
			
代码累计 300+575+475+353+620+703=2926 随笔字数 1700+3000+3785+4210+4333+3032=20727 知识点 机器学习,支持向量机 数据库技术 Acm刷 ...
 - PAT 1074 宇宙无敌加法器
			
https://pintia.cn/problem-sets/994805260223102976/problems/994805263297527808 地球人习惯使用十进制数,并且默认一个数字的每 ...