SP8093 JZPGYZ - Sevenk Love Oimaster(广义SAM)
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)相关推荐
- BZOJ-2780 Sevenk Love Oimaster(广义后缀自动机)
BZOJ-2780 Sevenk Love Oimaster(广义后缀自动机) 题目链接 题意 给出n个字符串,询问m个串一共出现在几个字符串中. 题解 广义后缀自动机板子题 将n个串建在一起,每次插 ...
- BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)
题目链接 \(Description\) 给定n个模式串,多次询问一个串在多少个模式串中出现过.(字符集为26个小写字母) \(Solution\) 对每个询问串进行匹配最终会达到一个节点,我们需要得 ...
- 【BZOJ2780】【SPOJ】Sevenk Love Oimaster(广义后缀自动机)
Description 有n个大串和m个询问,每次给出一个字符串s询问在多少个大串中出现过. Solution 广义后缀自动机入门题. 其实就是在插入一个串后将last设为root即可. 然后统计每个 ...
- BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )
全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分+RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries ...
- Bzoj2780: [Spoj]8093 Sevenk Love Oimaster
题目 传送门 Sol 就是广义\(sam\) 然后记录下每个状态属于哪些串,开\(set\)维护 \(parent\)树上启发式合并一下就好了 # include <bits/stdc++.h& ...
- Luogu4022 CTSC2012 熟悉的文章 广义SAM、二分答案、单调队列
传送门 先将所有模板串扔进广义SAM.发现作文的\(L0\)具有单调性,即\(L0\)更小不会影响答案,所以二分答案. 假设当前二分的值为\(mid\),将当前的作文放到广义SAM上匹配. 设对于第\ ...
- P4022-[CTSC2012]熟悉的文章【广义SAM,dp,单调队列】
正题 题目链接:https://www.luogu.com.cn/problem/P4022 题目大意 给出mmm个模板串. 然后nnn次询问给出一个串SSS要求找到一个最大的LLL使得能够将SSS超 ...
- P6793-[SNOI2020]字符串【广义SAM,贪心】
正题 题目链接:https://www.luogu.com.cn/problem/P6793 题目大意 给出两个长度为nnn的字符串,取出他们所有长度为kkk的连续子串分别构成两个可重集合A,BA,B ...
- 喵星球上的点名——记一个用广义SAM根号维护多串的技巧
喵星球的上的点名 给定一个字符串集合S,每次给定T询问S中有多少个字符串中包含T,最后询问S中的每一个字符串包含了多少次给定的T. 思路 考虑将这S个字符串建立广义SAM,那么我们每次将T放到广义SA ...
最新文章
- UML2.0工具比較
- MathType支持64位 WIN 7Office 2013(完美解决)(转载)
- 给电脑换源 npm 国内镜像 cnpm
- redis-cli使用密码登录
- halcon边缘检测的方法及各种方法的适用范围
- Spark初识-弹性分布式数据集RDD
- 课程作业01的设计思想、程序流程图、源程序代码和结果截图整理
- CoAP学习笔记——服务器端繁忙时的处理请求流程
- 劝你别再闷头自学NLP了!!!请收下这套自然语言处理(NLP)算法学习路线!
- 简要说明python的缩进规则_关于python的缩进规则的知识点详解
- 【Java项目实战】黄金矿工小游戏项目介绍
- StringUtil工具类之去除所有的空白字符
- 阿拉丁2021年度小程序白皮书发布,凡泰极客 FinClip 技术再度入选(内附完整白皮书下载)
- NLP实战 文本关键词提取
- Google Java Style 中文版
- TopCoder入门教程(转载)
- ROS编程入门教程(全过程示例代码)
- 如何用c语言实现【猜数字游戏】
- 新网络时代学习方式的大变革
- Altium Designer输出GERBER文件与华秋DFM对比