[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 ...
随机推荐
- hierarchyviewer
支持的版本更低
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C 倒序并查集
C. Destroying Array time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 堡垒机前戏——paramiko
提要:在写堡垒机之前,我们必须要了解paramiko这个第三方库.有关于python的第三方库的安装很简单,可以自行百度. 该模块基于SSH用于连接远程服务器并执行相关操作. SSHClient 用于 ...
- libpng warning: iCCP: known incorrect sRGB profile告警处理
在 qt中加载某些 png图片会出现:libpng warning: iCCP: known incorrect sRGB profile 告警信息. 虽然没什么影响,但是总看到这个警告非常的不舒 ...
- 浏览器事件循环机制(event loop)
JS是单线程的 JS是单线程的,或者说只有一个主线程,也就是它一次只能执行一段代码.JS中其实是没有线程概念的,所谓的单线程也只是相对于多线程而言.JS的设计初衷就没有考虑这些,针对JS这种不具备并行 ...
- chromedriver安装
chromedriver.exe下载 淘宝的镜像地址可以下载 https://npm.taobao.org/mirrors/chromedriver/ 找到自己chrome浏览器适合的chromeDr ...
- mysql delete别名
有一个表的数据比较大,然后需要进行关联删除,删除的时候发现如下SQL报错:ELETE FROM test.test1 a WHERE EXISTS (SELECT 1 FROM test.test2 ...
- Leetcode题目198.打家劫舍(动态规划-简单)
题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给 ...
- shell [ ] 和 [[ ]] 区别
[参考文章]:shell if [[ ]]和[ ]区别 || && [参考文章]:Shell test 命令 1. [ ] 和 test test 等同于 [ ] 可用于判断某个条件 ...
- 对于join操作,MySQL它是咋做的?
首先我们对于join操作,需要了解两个概念:驱动表和被驱动表.首先先给出两张表: CREATE TABLE `t2` ( `id` ) NOT NULL, `a` ) DEFAULT NULL, `b ...