SP8093 JZPGYZ - Sevenk Love Oimaster(广义SAM)

思路:广义 S A M SAM SAM构建文本串,然后用以一个 s z [ p ] sz[p] sz[p]表示状态 p p p包含多少个原串,以及用一个 p r e [ p ] pre[p] pre[p]来去重,然后将每个串在 S A M SAM SAM上跑一遍,失配了说明不存在,否则输出 s z [ u ] sz[u] sz[u]。

时间复杂度: O ( n n ) O(n\sqrt{n}) O(nn ​)貌似

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define IOS ios::sync_with_stdio(false),cin.tie(0)
int n,q,pre[N];
string s[N];
struct SAM{int last,cnt;int ch[N<<1][26],fa[N<<1],len[N<<1],sz[N];void insert(int c){int p=last,np=++cnt;last=np;len[np]=len[p]+1;for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=np;if(!p) fa[np]=1;else {int q=ch[p][c];if(len[q]==len[p]+1) fa[np]=q;else  {int nq=++cnt;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof ch[q]);fa[nq]=fa[q],fa[q]=fa[np]=nq;for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;}}}void build(){cin>>n>>q;last=cnt=1;for(int i=1;i<=n;i++){ //广义SAM. cin>>s[i];last=1;for(int j=0;j<s[i].size();j++) insert(s[i][j]-'a');}for(int i=1;i<=n;i++){int u=1;for(int j=0;j<s[i].size();j++){    //在文本串上跑一遍SAM. int x=s[i][j]-'a';u=ch[u][x];for(int p=u;p&&pre[p]!=i;p=fa[p]) pre[p]=i,sz[p]++;   //记录状态p的对应的模式串编号pre[p] }                    //和状态p被多少个原串包含. }}void solve(){while(q--){string a;cin>>a;int ok=1,u=1;for(int i=0;i<a.size();i++){   //在文本串上跑一遍. int x=a[i]-'a';if(!ch[u][x]){    //如果失配了说明不存在. ok=0;break;}u=ch[u][x];}if(!ok) cout<<0<<endl;else cout<<sz[u]<<endl;} }
}sam;
int main(){IOS;sam.build();sam.solve();return 0;
}

SP8093 JZPGYZ - Sevenk Love Oimaster(广义SAM)相关推荐

  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. 【BZOJ2780】【SPOJ】Sevenk Love Oimaster(广义后缀自动机)

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

  4. BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )

    全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分+RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries ...

  5. Bzoj2780: [Spoj]8093 Sevenk Love Oimaster

    题目 传送门 Sol 就是广义\(sam\) 然后记录下每个状态属于哪些串,开\(set\)维护 \(parent\)树上启发式合并一下就好了 # include <bits/stdc++.h& ...

  6. Luogu4022 CTSC2012 熟悉的文章 广义SAM、二分答案、单调队列

    传送门 先将所有模板串扔进广义SAM.发现作文的\(L0\)具有单调性,即\(L0\)更小不会影响答案,所以二分答案. 假设当前二分的值为\(mid\),将当前的作文放到广义SAM上匹配. 设对于第\ ...

  7. P4022-[CTSC2012]熟悉的文章【广义SAM,dp,单调队列】

    正题 题目链接:https://www.luogu.com.cn/problem/P4022 题目大意 给出mmm个模板串. 然后nnn次询问给出一个串SSS要求找到一个最大的LLL使得能够将SSS超 ...

  8. P6793-[SNOI2020]字符串【广义SAM,贪心】

    正题 题目链接:https://www.luogu.com.cn/problem/P6793 题目大意 给出两个长度为nnn的字符串,取出他们所有长度为kkk的连续子串分别构成两个可重集合A,BA,B ...

  9. 喵星球上的点名——记一个用广义SAM根号维护多串的技巧

    喵星球的上的点名 给定一个字符串集合S,每次给定T询问S中有多少个字符串中包含T,最后询问S中的每一个字符串包含了多少次给定的T. 思路 考虑将这S个字符串建立广义SAM,那么我们每次将T放到广义SA ...

最新文章

  1. UML2.0工具比較
  2. MathType支持64位 WIN 7Office 2013(完美解决)(转载)
  3. 给电脑换源 npm 国内镜像 cnpm
  4. redis-cli使用密码登录
  5. halcon边缘检测的方法及各种方法的适用范围
  6. Spark初识-弹性分布式数据集RDD
  7. 课程作业01的设计思想、程序流程图、源程序代码和结果截图整理
  8. CoAP学习笔记——服务器端繁忙时的处理请求流程
  9. 劝你别再闷头自学NLP了!!!请收下这套自然语言处理(NLP)算法学习路线!
  10. 简要说明python的缩进规则_关于python的缩进规则的知识点详解
  11. 【Java项目实战】黄金矿工小游戏项目介绍
  12. StringUtil工具类之去除所有的空白字符
  13. 阿拉丁2021年度小程序白皮书发布,凡泰极客 FinClip 技术再度入选(内附完整白皮书下载)
  14. NLP实战 文本关键词提取
  15. Google Java Style 中文版
  16. TopCoder入门教程(转载)
  17. ROS编程入门教程(全过程示例代码)
  18. 如何用c语言实现【猜数字游戏】
  19. 新网络时代学习方式的大变革
  20. Altium Designer输出GERBER文件与华秋DFM对比

热门文章

  1. vue添加表情包的相关处理(使用html渲染)
  2. java语句witch,java程序流程控制--witch
  3. 教育技术专业核心期刊列表
  4. 小学一年级语文考试试题【15】
  5. Yes I can——强兵是怎样炼成的
  6. 我的 Win98+Win2K+Linux 装配方案
  7. spring-boot项目简单搭建
  8. 大小写字母转换、数字与字符转换及ASCII码表
  9. Java SPI机制原理和使用场景
  10. 机器学习-------算法(七)