BZOJ-2780 Sevenk Love Oimaster(广义后缀自动机)

题目链接

题意

给出n个字符串,询问m个串一共出现在几个字符串中.

题解

广义后缀自动机板子题

将n个串建在一起,每次插入新的字符串时回到根节点

字符串如果出现在另一个字符串中,一定可以在后缀自动机上匹配到,而且在后缀自动机中就是某一个后缀的前缀即一个节点的后缀(slink)

建完广义后缀自动机之后,把n个串出现的节点标记,然后拿m个串分别在后缀自动机上匹配即可

其他

感觉这道题也能用后缀数组写,对每个询问求出它Sa的最长区间,然后离线用树状数组维护区间不同数字,复杂度因该是nlognnlognnlogn但是一直TLE…

#include <bits/stdc++.h>
const int maxn = 5e5 + 5;
using namespace std;
struct SAM{int trans[maxn<<1][26], slink[maxn<<1], maxlen[maxn<<1];int cnt[maxn], vis[maxn];int last, now, root, len;void init() {now = last = root = 1;}void newnode (int v) {maxlen[++now] = v;}void extend (int c) {newnode(maxlen[last]+1);int p = last, np = now;while (p && !trans[p][c]) {trans[p][c] = np;p = slink[p];}if (!p) slink[np] = root;else {int q = trans[p][c];if (maxlen[p] + 1 != maxlen[q]) {newnode(maxlen[p] + 1);int nq = now;memcpy(trans[nq], trans[q], sizeof(trans[q]));slink[nq] = slink[q];slink[q] = slink[np] = nq;while (p && trans[p][c] == q) {trans[p][c] = nq;p = slink[p];}}else slink[np] = q;}last = np;}void build(char *s) {len = strlen(s);last = 1;for (int i = 0; i < len; ++i) extend(s[i] - 'a');}void init(char *s, int l, int r, int num) {int tnow = 1;for (int i = l; i < r; ++i) {tnow = trans[tnow][s[i] - 'a'];int tmp = tnow;while (tmp && vis[tmp] != num) {vis[tmp] = num;cnt[tmp]++;tmp = slink[tmp];}}}int solve(char *s) {int tlen = strlen(s);int tnow = 1;for (int i = 0; i < tlen; ++i) tnow = trans[tnow][s[i] - 'a'];return cnt[tnow];}
}sam;
char s[maxn];
int l[maxn], r[maxn];
int main() {int now = 0;int n, m;sam.init();scanf("%d %d", &n, &m);for (int i = 1; i <= n; ++i) {l[i] = now;scanf("%s", s+now);sam.build(s+now);now = strlen(s);r[i] = now;}for (int i = 1; i <= n; ++i) {sam.init(s, l[i], r[i], i);}for (int i = 0; i < m; ++i) {scanf("%s", s);printf("%d\n", sam.solve(s));}return 0;
}

BZOJ-2780 Sevenk Love Oimaster(广义后缀自动机)相关推荐

  1. BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)

    题目链接 \(Description\) 给定n个模式串,多次询问一个串在多少个模式串中出现过.(字符集为26个小写字母) \(Solution\) 对每个询问串进行匹配最终会达到一个节点,我们需要得 ...

  2. bzoj 4566 找相同字符 —— 广义后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4566 建出两个串的广义后缀自动机: 统计每个点在两个串中出现次数的子树和,其实就是在两个串中 ...

  3. 【BZOJ2780】【SPOJ】Sevenk Love Oimaster(广义后缀自动机)

    Description 有n个大串和m个询问,每次给出一个字符串s询问在多少个大串中出现过. Solution 广义后缀自动机入门题. 其实就是在插入一个串后将last设为root即可. 然后统计每个 ...

  4. BZOJ.3277.串(广义后缀自动机)

    题目链接 \(Description\) 给定n个串和K,求每个串中有多少个子串是这n个串中至少K个串的子串. \(Solution\) 同上题,我们可以算出每个节点所代表的串出现在了几个串中:而且我 ...

  5. bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 1009   Solved: 596 [ Subm ...

  6. 【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机

    [BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝 ...

  7. BZOJ3277 串 【广义后缀自动机】

    Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中 至少k个字符串的子串(注意包括本身). Input 第一行两个整数n, ...

  8. 【bzoj5084】hashit 广义后缀自动机+树链的并+STL-set

    题目描述 你有一个字符串S,一开始为空串,要求支持两种操作 在S后面加入字母C 删除S最后一个字母 问每次操作后S有多少个两两不同的连续子串 输入 一行一个字符串Q,表示对S的操作 如果第i个字母是小 ...

  9. BZOJ5137lg4081(广义后缀自动机,set启发式合并)

    BZOJ5137&&lg4081(广义后缀自动机,set启发式合并) 题面 自己找去 HINT 给定多个文本串,让你查询每个文本串中有多少个本质不同的子串且这个子串只出现在当前这个文本 ...

最新文章

  1. 计算机统考408卷子谁批,【计算机统考】你对计算机统考408了解有多少?
  2. PLSQL_SQL Loader的概念和用法(概念)
  3. 3,ORM组件XCode(简介)
  4. iOS App Launch Option
  5. SpringMVC中@ResponseBody和@RequestBody的使用
  6. 人人商城v2获取头像出错多出132132
  7. .NET环境下每日集成(4):CruiseControl.Net配置注意事项
  8. jvm 助记符_您的JVM是否泄漏文件描述符-像我的一样?
  9. 报表引擎API开发入门—简单程序数据集
  10. python对数据进行统计分析_数据分析员用python做数据分析是怎么回事,需要用到python中的那些内容,具体是怎么操作的?...
  11. PHP使用DES进行加密和解密
  12. linux内核中的以太网phy芯片的驱动介绍:以lan8720和ip101作为对比
  13. C# MessageBox用法大全
  14. Windows鼠标右键没有“新建”“新建文件夹”选项
  15. python-普通pdf的添加水印
  16. java加法处理器 图形界面,java作业设置加法器界面
  17. Vuex的响应式原理
  18. Vue如何使用iconfont(阿里图标库)
  19. 计算机技术非全日制调剂2020,2020年硕士研究生部分非全日制专业接收调剂的公告...
  20. 关于OAI-PMH协议

热门文章

  1. CA证书和TLS介绍
  2. 06004_Redis的启动、使用和停止
  3. Deep Learning菜鸡篇,我的第一个深度神经网络
  4. HDU 2289 Cup
  5. ArcGIS for window mobile 数据打开
  6. linux 环境搭建
  7. LeetCode-Add Binary
  8. 小波图像分解与重构程序存在的问题与解决办法
  9. 投靠Linux第一步 Windows数据向Linux迁徙(1)
  10. SQL注入1-5_cookie基于base64的注入