BZOJ2780:[SPOJ8093]Sevenk Love Oimaster(广义SAM)
Description
Input
Output
For each question, output the answer in one line.
Sample Input
abcabcabc
aaa
aafe
abc
a
ca
Sample Output
3
1
Solution
先把大串的广义$SAM$建出来,然后用$n$个大串在$SAM$上跑。每个点开一个$vis[i]$和$size[i]$,存这个点上一次被哪个大串访问,这个点一共被几个大串访问过。
同时每访问一个点,就要沿着这个点的$fa$指针往上暴跳,更新$vis$,同时$size+1$。直到跳到一个$vis$是当前大串的点就停止。
答案就是用询问串在$SAM$上跑,终点的$size$值。
还有一个$nlogn$的做法我不会QAQ
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#define N (201000)
using namespace std; int n,m,l[N],r[N];
char s[N<<],t[N<<]; struct SAM
{
int son[N][],fa[N],step[N],size[N],vis[N];
int p,q,np,nq,last,cnt;
SAM(){last=cnt=;} void Insert(int x)
{
p=last; np=last=++cnt; step[np]=step[p]+;
while (p && !son[p][x]) son[p][x]=np, p=fa[p];
if (!p) fa[np]=;
else
{
q=son[p][x];
if (step[q]==step[p]+) fa[np]=q;
else
{
nq=++cnt; step[nq]=step[p]+;
memcpy(son[nq],son[q],sizeof(son[q]));
fa[nq]=fa[q]; fa[q]=fa[np]=nq;
while (son[p][x]==q) son[p][x]=nq,p=fa[p];
}
}
}
void Calc()
{
for (int i=; i<=n; ++i)
{
int now=;
for (int j=l[i]; j<r[i]; ++j)
{
now=son[now][s[j]-'a'];
int t=now;
while (t && vis[t]!=i) vis[t]=i,++size[t],t=fa[t];
}
}
}
void Find(char s[])
{
int now=;
for (int j=,l=strlen(s); j<l; ++j)
now=son[now][s[j]-'a'];
printf("%d\n",size[now]);
}
}SAM; int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=n; ++i)
{
scanf("%s",s+r[i-]); int len=strlen(s+r[i-]);
l[i]=r[i-], r[i]=l[i]+len;
}
for (int i=; i<=n; ++i,SAM.last=)
for (int j=l[i]; j<r[i]; ++j)
SAM.Insert(s[j]-'a');
SAM.Calc();
for (int i=; i<=m; ++i)
scanf("%s",t),SAM.Find(t);
}
BZOJ2780:[SPOJ8093]Sevenk Love Oimaster(广义SAM)的更多相关文章
- [bzoj2780][Spoj8093]Sevenk Love Oimaster_广义后缀自动机
		Sevenk Love Oimaster bzoj-2780 Spoj-8093 题目大意:给定$n$个大串和$m$次询问,每次给出一个字符串$s$询问在多少个大串中出现过. 注释:$1\le n\l ... 
- BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)
		题目链接 \(Description\) 给定n个模式串,多次询问一个串在多少个模式串中出现过.(字符集为26个小写字母) \(Solution\) 对每个询问串进行匹配最终会达到一个节点,我们需要得 ... 
- [BZOJ2780][SPOJ8093]Sevenk Love Oimaster
		bzoj luogu 题面 给定n个模板串,以及m个查询串. 依次查询每一个查询串是多少个模板串的子串. sol 广义后缀自动机裸题? 先建出\(SAM\),然后记录一下每个节点分别在多少个模板串里出 ... 
- 【BZOJ2780】[Spoj]8093 Sevenk Love Oimaster 广义后缀自动机
		[BZOJ2780][Spoj]8093 Sevenk Love Oimaster Description Oimaster and sevenk love each other. But r ... 
- BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster [广义后缀自动机]
		JZPGYZ - Sevenk Love Oimaster Oimaster and sevenk love each other. But recently,sevenk hea ... 
- 【BZOJ2780】Sevenk Love Oimaster【广义后缀自动机】
		题意 给出你n个字符串和q个查询,每个查询给出一个字符串s,对于每个查询你都要输出这个字符串s在上面多少个字符串中出现过. 分析 广义后缀自动机的裸题.建好SAM以后再跑一遍得到每个状态的ocu和la ... 
- SP8093 JZPGYZ - Sevenk Love Oimaster(广义后缀自动机)
		题意 题目链接 Sol 广义后缀自动机板子题..和BZOJ串那个题很像 首先建出询问串的SAM,然后统计一下每个节点被多少个串包含 最后直接拿询问串上去跑就行了 #include<bits/st ... 
- BZOJ 2780 [Spoj]8093 Sevenk Love Oimaster ——广义后缀自动机
		给定n个串m个询问,问每个串在n个串多少个串中出现了. 构建广义后缀自动机,(就是把所有字符串的后缀自动机合并起来)其实只需要add的时候注意一下就可以了. 然后对于每一个串,跑一边匹配,到达了now ... 
- Spoj8093 Sevenk Love Oimaster
		题目描述 题解: 对于所有n串建广义后缀自动机. (广义后缀自动机唯一区别就是每次将las附成1,并不需要在插入时特判) 建完后再建出parent树,然后用dfs序+树状数组搞区间不同种类. 其实就是 ... 
随机推荐
- get/post 接口调用
			content-type: application/~~~~~ /// <summary> /// Post数据到网站 /// </summary> /// <para ... 
- AutoResetEvent和ManualResetEvent理解
			AutoResetEvent和ManualResetEvent用于多线程之间代码执行顺序的控制,它们继承自WaitHandle,API相同,但在使用中还是有区别的. 每次使用时虽然理解了,但由于没有去 ... 
- IO流的复习笔记
			IO字节流和缓冲流 IO字节流的读取和写入 读取 import java.io.FileInputStream; import java.io.FileNotFoundException; impor ... 
- 如何在vscode里面调试js和node.js
			一般大家调试都是在浏览器端调试js的,不过有些时候也想和后台一样在代码工具里面调试js或者node.js,下面介绍下怎样在vscode里面走断点. 1,用来调试js 一:在左侧扩展中搜索Debugge ... 
- python中参数传递的方法
			Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递,不定参数传递(包裹传递)和解包裹传递. 1.位置传递实例: def fun(a,b,c) return a+b+ ... 
- js中windows的函数(随机数,计时器的实现)
			<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- git杂记-分支简介
			分支创建 //只创建分支不切换: $ git branch testing //创建并切换分支$ git checkout -b iss53 查看各个分支的指向对象 $ git log --oneli ... 
- 微服务架构之spring cloud 介绍
			在当前的软件开发行业中,尤其是互联网,微服务是非常炽热的一个词语,市面上已经有一些成型的微服务框架来帮助开发者简化开发工作量,但spring cloud 绝对占有一席之地,不管你是否为java开发,大 ... 
- 工具Sequel Pro简介
			从图中可以看到,sequel工作界面主要分成三部分,左边侧边显示的是当前所连接的数据库中存在的数据表,右侧上半部分则是用于写sql的地方,在Mac环境下按command+R键会执行你所写的sql,右侧 ... 
- 交叉编译 Cross-compiling for Linux
			@(134 - Linux) Part 1 交叉编译简介 1.1 What is cross-compiling? 对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么 ... 
