[bzoj2746][HEOI2012]旅行问题 _AC自动机_倍增
[HEOI2012]旅行问题
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2746
题解:
这个是讲课时候的题。
讲课的时候都在想怎么后缀自动机....
当然是能做啦,$SAM$这么强。
实际上是个$AC$自动机,按照题目模拟就行了。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1 << 20 ;
const int mod = 1000000007 ;
const int P = 21 ;
queue <int> Q;
int n, m, ch[N][26], fail[N][25], dep[N], tail, cnt, pos[N << 1], lenth[N];
char str[N];
ll Hash[N];
void insert() {
	int len = strlen(str);
	int p = 0;
	for (int i = 0; i < len; i ++ ) {
		int c = str[i] - 'a';
		if (!ch[p][c]) {
			ch[p][c] = ++tail;
			Hash[ch[p][c]] = (((Hash[p] * 26) % mod) + c) % mod;
		}
		pos[ ++ cnt] = ch[p][c];
		p = ch[p][c];
	}
}
void getfail() {
	dep[0] = 0;
	for (int i = 0; i < 26; i ++ ) {
		if (ch[0][i]) {
			fail[ch[0][i]][0] = 0;
			dep[ch[0][i]] = 1;
			Q.push(ch[0][i]);
		}
	}
	while (!Q.empty()) {
		int top = Q.front();
		Q.pop();
		for (int i = 0; i < 26; i ++ ) {
			if (!ch[top][i]) {
				ch[top][i] = ch[fail[top][0]][i];
				continue;
			}
			int u = ch[top][i];
			fail[u][0] = ch[fail[top][0]][i];
			dep[u] = dep[fail[u][0]] + 1;
			for (int j = 1; j < P; j ++ ) {
				fail[u][j] = fail[fail[u][j - 1]][j - 1];
			}
			Q.push(u);
		}
	}
}
int getlca(int u, int v) {
	if (dep[u] < dep[v]) {
		swap(u, v);
	}
	int d = dep[u] - dep[v];
	for (int i = 0; d; d >>= 1, i ++ ) {
		if (d & 1) {
			u = fail[u][i];
		}
	}
	if (u == v) {
		return u;
	}
	for (int p = P - 1; p >= 0; p -- ) {
		if (fail[u][p] != fail[v][p]) {
			u = fail[u][p];
			v = fail[v][p];
		}
	}
	return fail[u][0];
}
int main() {
	scanf("%d", &n);
	memset(fail, 0, sizeof fail);
	lenth[0] = 0;
	for (int i = 1; i <= n; i ++ ) {
		scanf("%s", str);
		insert();
		lenth[i] = strlen(str);
		lenth[i] += lenth[i - 1];
	}
	getfail();
	scanf("%d", &m);
	while (m -- ) {
		int p1, l1, p2, l2;
		scanf("%d%d%d%d", &p1, &l1, &p2, &l2);
		int t1 = pos[lenth[p1 - 1] + l1];
		int t2 = pos[lenth[p2 - 1] + l2];
		int lca = getlca(t1, t2);
		printf("%lld\n", Hash[lca]);
	}
	return 0;
}
小结:注意一下AC自动机找LCA要倍增,别直接跳fail......
[bzoj2746][HEOI2012]旅行问题 _AC自动机_倍增的更多相关文章
- BZOJ2746: [HEOI2012]旅行问题(AC自动机 LCA)
		
Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 1188 Solved: 383[Submit][Status][Discuss] Descripti ...
 - bzoj 2746: [HEOI2012]旅行问题 AC自动机fail树
		
2746: [HEOI2012]旅行问题 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 489 Solved: 174[Submit][Status ...
 - [bzoj1212][HNOI2004]L语言_AC自动机_动态规划
		
L语言 bzoj-1212 HNOI-2004 题目大意:给你一个n个单词的集合,然后给你m条字符串.问每条字符串可以被理解的最长前缀.被理解当且仅当存在一种分割使得每一段都是集合里的元素. 注释:$ ...
 - [bzoj3530][Sdoi2014]数数_AC自动机_数位dp
		
数数 bzoj-3530 Sdoi-2014 题目大意:给你一个整数集合,求所有不超过n的正整数,是的它的十进制表示下不能再一段等于集合中的任意数. 注释:$1\le n \le 1200$,$1\l ...
 - [HEOI2012]旅行问题 AC 自动机
		
题意: 求两个字符串的最长公共后缀,使得该后缀是某个字符串的前缀. 题解: 直接利用 $fail$ 指针的定义即可. 相当于求自动机上两点的 LCA,好像倍增可以,怕炸空间就老老实实写树剖吧. Cod ...
 - BZOJ 2746: [HEOI2012]旅行问题
		
2746: [HEOI2012]旅行问题 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 921 Solved: 291[Submit][Status ...
 - BZOJ_1030_[JSOI2007]文本生成器_AC自动机+DP
		
BZOJ_1030_[JSOI2007]文本生成器_AC自动机+DP Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他 ...
 - BZOJ_2938_[Poi2000]病毒_AC自动机
		
BZOJ_2938_[Poi2000]病毒_AC自动机 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们 ...
 - 【codeforces666E】Forensic Examination  广义后缀自动机+树上倍增+线段树合并
		
题目描述 给出 $S$ 串和 $m$ 个 $T_i$ 串,$q$ 次询问,每次询问给出 $l$ .$r$ .$x$ .$y$ ,求 $S_{x...y}$ 在 $T_l,T_{l+1},...,T_r ...
 
随机推荐
- encodeURI()、encodeURIComponent()、escape()
			
URI的通用格式如下: /*** 协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数1=值1&参数2=值2+值3#标志 **/ /*** http://use ...
 - Error: 'The service did not respond in a timely fashion'
			
Windows启动时候报这个错,不应在OnStart放执行长的过程,需要开另一个线程来做才能顺利启动 Windows Services: OnStart loop - do I need to del ...
 - 数学函数(C/C++)
			
C中包含头文件<math.h> C++包含头文件<cmath> 函数 double cos(double) 该函数返回弧度角(double型)的余弦 double tan(do ...
 - 白鹭引擎EUI做H5活动 巩固篇
			
项目目录 上面这张图片是项目的目录结构,咋们一点一点来讲解: .wing:包括 Egret 项目的任务配置文件和启动配置文件. wingProperties.json:Egret Wing 项目配置文 ...
 - 【分类模型评判指标 一】混淆矩阵(Confusion Matrix)
			
转自:https://blog.csdn.net/Orange_Spotty_Cat/article/details/80520839 略有改动,仅供个人学习使用 简介 混淆矩阵是ROC曲线绘制的基础 ...
 - MySQL优化相关参数--先做个记录,以后可能用得到
			
innodb_io_capacity:可设置的磁盘IO性能参数,越高代表当前mysql的IO性能更好,可用做决策刷脏页速度的参数: innodb_flush_neighbors:刷脏页是否开启连坐机制 ...
 - 本地服务CURL请求本地另一个服务API返回超时/或无返回
			
入职之后一直在忙,终于有时间整理一波最近踩到的坑. 起因: 项目是微服务架构,一个项目对外提供API,新的项目调用API获得数据.于是就在本地搭建了两个服务.配置了两个虚拟域名,指向两个项目,当然我本 ...
 - LC 813. Largest Sum of Averages
			
We partition a row of numbers A into at most K adjacent (non-empty) groups, then our score is the su ...
 - Repeater, DataList, 和GridView的区别及使用
			
从对象层次图可以看出,Repeater是最轻最小的控件,它仅仅继承了基本控件的功能,包括ID属性.子控件集合等.另一方面,DataList和DataGrid则继承了WebControl功能,包括样式和 ...
 - JS原生代码之倒计时抢购
			
学到了原声js改变input的disabled的属性值,因为想让倒计时结束的同时,抢购按钮可以被点击.代码为:document.getElementById("buy").disa ...