Description

有n个大串和m个询问,每次给出一个字符串s询问在多少个大串中出现过。


Solution

广义后缀自动机入门题。

其实就是在插入一个串后将last设为root即可。
然后统计每个节点所代表的串是多少个输入串的子串。
对于每次询问,直接在SAM上走一遍就行了。

至于时间复杂度,感觉真的很迷啊。。


Code

/*************************************** Au: Hany01* Date: May 5th, 2018* Prob: [BZOJ2780][SPOJ JZPGYZ] Sevenk Love Oimaster* Email: hany01@foxmail.com
**************************************/#include<bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int, int> PII;
typedef vector<int> VI;
#define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
#define rep(i, j) for (register int i = 0, i##_end_ = j; i < i##_end_; ++ i)
#define For(i, j ,k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i)
#define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i)
#define Set(a, b) memset(a, b, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define SZ(a) ((int)(a.size()))
#define ALL(a) a.begin(), a.end()
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define INF (0x3f3f3f3f)
#define INF1 (2139062143)
#define Mod (1000000007)
#define y1 wozenmezhemecaia
#ifdef hany01
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define debug(...)
#endiftemplate<typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }inline int read() {register char c_; register int _, __;for (_ = 0, __ = 1, c_ = getchar(); !isdigit(c_); c_ = getchar()) if (c_ == '-')  __ = -1;for ( ; isdigit(c_); c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48);return _ * __;
}const int maxn = 10005, maxl = 100005, maxq = 360005;int tot = 1, las, len[maxl << 1], fa[maxl << 1], ch[maxl << 1][26], mk[maxl << 1], cnt[maxl << 1], n, m, L[maxn];
char p[maxq];
string s[maxn];inline void extend(int c)
{int np = ++ tot, p = las;las = tot, len[np] = len[p] + 1;while (p && !ch[p][c]) ch[p][c] = np, p = fa[p];if (!p) fa[np] = 1;else {int q = ch[p][c];if (len[q] == len[p] + 1) fa[np] = q;else {int nq = ++ tot;fa[nq] = fa[q], Cpy(ch[nq], ch[q]), len[nq] = len[p] + 1;fa[q] = fa[np] = nq;while (p && ch[p][c] == q) ch[p][c] = nq, p = fa[p];}}
}int main()
{
#ifdef hany01File("bzoj2780");
#endifios::sync_with_stdio(false);cin >> n >> m;For(i, 1, n) {cin >> s[i];L[i] = s[i].length(), las = 1;rep(j, L[i]) extend(s[i][j] - 97);}For(i, 1, n) {int u = 1;rep(j, L[i]) {u = ch[u][s[i][j] - 97];int v = u;while (v && mk[v] != i) mk[v] = i, ++ cnt[v], v = fa[v];}}while (m --){cin >> p;int u = 1;rep(i, strlen(p)) u = ch[u][p[i] - 97];printf("%d\n", cnt[u]);}return 0;
}
//露清枕簟藕花香,恨悠扬。
//    -- 顾敻《虞美人·触帘风送景阳钟》

【BZOJ2780】【SPOJ】Sevenk Love Oimaster(广义后缀自动机)相关推荐

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

    BZOJ-2780 Sevenk Love Oimaster(广义后缀自动机) 题目链接 题意 给出n个字符串,询问m个串一共出现在几个字符串中. 题解 广义后缀自动机板子题 将n个串建在一起,每次插 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. BZOJ-3473 (广义后缀自动机:拓扑 or 启发式合并)

    BZOJ-3473 (广义后缀自动机:拓扑 or 启发式合并) 题目链接 题意 nnn个字符串,询问每个字符串一共有几个子串至少出现在nnn个字符串中的kkk个 思路: 拓扑 建广义后缀自动机, dp ...

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

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

最新文章

  1. 大数据如何在商业银行战略规划中发挥作用
  2. 带电可擦写可编程只读存储器(24LC08B)的基本原理
  3. 如何准备启动敏捷-迭代0如何做?
  4. Central Authentication Service
  5. 大四中软实习笔记201303011文件
  6. Cloud for Customer的事件处理队列
  7. 基于嵌入式webserver的服务器状态监控
  8. odoo10参考系列--命令行接口:odoo-bin
  9. Android系统是目前最为流行的手机系统之一
  10. RTDS学习笔记——网口连接
  11. 为Ubuntu安装中文语言包
  12. 记账系统推荐金蝶精斗云_金蝶精斗云企业免费会计记账软件有哪几种?
  13. 采用面向接口编程思想组装一台计算机
  14. 浅论语言与认知的关系 | NLP基础
  15. 计算机网络基本概念相关习题
  16. 百万前端之js通过链接生成二维码可以保存下载复制
  17. Stay hungry, Stay foolish 的原义
  18. 【编程不良人】快速入门Spring学习笔记08---事务属性、Spring整合Structs2框架(SM)、Spring整合Mybatis+Struts2(SSM)、Spring注解、SSM注解式开发
  19. 作茧自缚or破茧成蝶?墨菲定律下,华为P40搭档鸿蒙OS奋力一击
  20. 本地同城地方门户网这样运营轻轻松松拿到5W广告费

热门文章

  1. 计算机硬件保留内存,win7系统电脑给硬件保留内存太多的解决方法
  2. 差分方程基础知识备注
  3. 写给Android工程师的协程指南
  4. 360清理痕迹后,系统启动变的超慢
  5. 建站系列教程(二)--本地局域网访问和域名解析
  6. Linux下使用system函数获取命令执行返回结果
  7. Windows给力!可以扔掉Linux虚拟机了!
  8. 三国突然消失的六大名人:一人是顶尖谋士,一人勇武斩杀魏
  9. 科目二如何能顺利通过?科目二经验
  10. 开漏输出 推挽输出