[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. php遍历一个文件下的所有文件和子文件夹下的文件

    function AllFile($dir){ if($dh = opendir($dir)){ while (($file = readdir($dh)) !== false){ if($file ...

  2. 51 Nod 1475 建设国家 (优先队列+贪心)

    1475 建设国家  基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 小C现在想建设一个国家.这个国家中有一个首都,然后有若干个中间站,还有若干个城 ...

  3. 两种dp模型

    两个常见模型 bzoj 4321 题意:编号为1~n的人排成一排,问有多少种排法使得任意相邻两人的编号之差不为1或-1. n<=1000 排列计数问题:考虑把数从小到大插入的过程进行dp. 设 ...

  4. Bert系列 源码解读 四 篇章

    Bert系列(一)——demo运行 Bert系列(二)——模型主体源码解读 Bert系列(三)——源码解读之Pre-trainBert系列(四)——源码解读之Fine-tune 转载自: https: ...

  5. linux 搭建 jenkins 前端自动构建时,老是提示 sh: vue-cli-service: command not found

    如题. 在 shell 里面执行  env 发现一个   NODE_ENV=production  的环境变量,是这个东西的原因. 通过  unset NODE_ENV  命令去掉这个环境变量就可以了 ...

  6. CDialog::DoModal()问题和_WIN32_WINNT

    1.从CDialogEx派生自己的CMyDialog,到DoModal()时总提示 error C2039: "DoModal": 不是"CMyDialog"的 ...

  7. single-pass单遍聚类方法

    一.通常关于文本聚类也都是针对已有的一堆历史数据进行聚类,比如常用的方法有kmeans,dbscan等.如果有个需求需要针对流式文本进行聚类(即来一条聚一条),那么这些方法都不太适用了,当然也有很多其 ...

  8. layer提示带文字

    直接撸代码: //加载层-风格4 layer.msg('加载中', { icon: 16 ,shade: 0.01 });

  9. win 内网frp反弹到内网liunx

    前提:frp不同系统 但是版本必须完全相同 这是我的两个版本 我这个就是验证frp可以在不同系统之间使用 准备工作 靶机 win2003 ip 192.168.1.132 公网 vps windows ...

  10. myeclipse使用SVN分支与合并详解

    此博文主要内容来源地址:https://blog.csdn.net/liuyifeng1920/article/details/53118183,感谢原创博主: 先介绍一下svn的两种开发和发布的规范 ...