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

  1. BZOJ2746: [HEOI2012]旅行问题(AC自动机 LCA)

    Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 1188  Solved: 383[Submit][Status][Discuss] Descripti ...

  2. bzoj 2746: [HEOI2012]旅行问题 AC自动机fail树

    2746: [HEOI2012]旅行问题 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 489  Solved: 174[Submit][Status ...

  3. [bzoj1212][HNOI2004]L语言_AC自动机_动态规划

    L语言 bzoj-1212 HNOI-2004 题目大意:给你一个n个单词的集合,然后给你m条字符串.问每条字符串可以被理解的最长前缀.被理解当且仅当存在一种分割使得每一段都是集合里的元素. 注释:$ ...

  4. [bzoj3530][Sdoi2014]数数_AC自动机_数位dp

    数数 bzoj-3530 Sdoi-2014 题目大意:给你一个整数集合,求所有不超过n的正整数,是的它的十进制表示下不能再一段等于集合中的任意数. 注释:$1\le n \le 1200$,$1\l ...

  5. [HEOI2012]旅行问题 AC 自动机

    题意: 求两个字符串的最长公共后缀,使得该后缀是某个字符串的前缀. 题解: 直接利用 $fail$ 指针的定义即可. 相当于求自动机上两点的 LCA,好像倍增可以,怕炸空间就老老实实写树剖吧. Cod ...

  6. BZOJ 2746: [HEOI2012]旅行问题

    2746: [HEOI2012]旅行问题 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 921  Solved: 291[Submit][Status ...

  7. BZOJ_1030_[JSOI2007]文本生成器_AC自动机+DP

    BZOJ_1030_[JSOI2007]文本生成器_AC自动机+DP Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他 ...

  8. BZOJ_2938_[Poi2000]病毒_AC自动机

    BZOJ_2938_[Poi2000]病毒_AC自动机 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们 ...

  9. 【codeforces666E】Forensic Examination 广义后缀自动机+树上倍增+线段树合并

    题目描述 给出 $S$ 串和 $m$ 个 $T_i$ 串,$q$ 次询问,每次询问给出 $l$ .$r$ .$x$ .$y$ ,求 $S_{x...y}$ 在 $T_l,T_{l+1},...,T_r ...

随机推荐

  1. python第三方库安装

    如安装jieba分词库 代码对Python 2/3均兼容 全自动安装:easy_install jieba或者pip install jieba / pip3 install jieba 半自动安装: ...

  2. Gym 100548F Color 给花染色 容斥+组合数学+逆元 铜牌题

    Problem F. ColorDescriptionRecently, Mr. Big recieved n flowers from his fans. He wants to recolor th ...

  3. [Luogu] 飞扬的小鸟

    https://www.luogu.org/problemnew/show/P1941 Bfs or Dp #include <bits/stdc++.h> using namespace ...

  4. HGOI 20191106 题解

    Problem A  旅行者 有$n$种转移装置,每种转移装置本质相同,每种装置可以前进$a_i$单位,但只有$b_i$个. 从初始坐标为$0$出发,途中不能经过$c_1,c2,...,c_m$中的任 ...

  5. CF427D

    CF427D SA的奇技淫巧,其实就是板子. 题意: 给定两个字符串,求最短的满足各只出现一次的连续公共字串 解析: 一般情况下,SA都是用来求最长公共前缀的,好像和这道题所求的最短公共子串没有任何关 ...

  6. Raspberry Pi 4B基本设置

    目录 一.SSH登录Raspberry Pi 二.开启VNC服务 三.将SD卡分区扩展 四.修改软件源 一.SSH登录Raspberry Pi 完成系统烧录后,就需要登录Raspberry Pi,此时 ...

  7. Java 标准 IO 流编程一览笔录( 上 )

    Java标准I/O知识体系图: 1.I/O是什么? I/O 是Input/Output(输入.输出)的简称,输入流可以理解为向内存输入,输出流是从内存输出. 2.流 流是一个连续的数据流,可以从流中读 ...

  8. Linux设备驱动程序 之 装载和卸载模块

    前置说明 本文例子中涉及两个模块hello.ko和world.ko,其中hello导出符号供world使用: insmod 该命令将模块的代码和数据装入内核,然后使用内核的符号表继续模块中任何未解析的 ...

  9. ELK(elasticsearch+logstash+kibana)入门到熟练-从0开始搭建日志分析系统教程

    #此文篇幅较长,涵盖了elk从搭建到运行的知识,看此文档,你需要会点linux,还要看得懂点正则表达式,还有一个聪明的大脑,如果你没有漏掉步骤的话,还搭建不起来elk,你来打我. ELK使用elast ...

  10. go代理设置

    在Go 1.13中,我们可以通过GOPROXY来控制代理,以及通过GOPRIVATE控制私有库不走代理. 设置GOPROXY代理: go env -w GOPROXY=https://goproxy. ...