[bzoj2780][Spoj8093]Sevenk Love Oimaster_广义后缀自动机
Sevenk Love Oimaster bzoj-2780 Spoj-8093
题目大意:给定$n$个大串和$m$次询问,每次给出一个字符串$s$询问在多少个大串中出现过。
注释:$1\le n\le 10^4$,$1\le q\le 6\cdot 10^4$,$the\ total\ length\ of\ n\ strings\ \le 10^5$,
$the\ total\ length\ of\ q\ question\ strings\le 3.6\times 10^5$。
想法:广义后缀自动机
先对$n$个串建立广义后缀自动机。
后缀自动机上每个节点记录下在多少个串串里出现过,记为$cnt_i$。
然后对于每个询问串,沿着$trans$指针走到当前的$now$节点,输出$cnt_{now}$即可。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#define N 200010
using namespace std;
int n,m,last=1,tot=1,tr[N][26],fa[N],len[N],cnt[N],vis[N];
string s[N],ss;
void update(int c)
{
int v=last,u=++tot;
last=u;
len[u]=len[v]+1;
while(v&&!tr[v][c]) tr[v][c]=u,v=fa[v];
if(!v) fa[u]=1;
else
{
int x=tr[v][c];
if(len[x]==len[v]+1) fa[u]=x;
else
{
int y=++tot;
memcpy(tr[y],tr[x],sizeof tr[y]);
fa[y]=fa[x]; fa[x]=fa[u]=y;
len[y]=len[v]+1;
while(v&&tr[v][c]==x) tr[v][c]=y,v=fa[v];
}
}
}
int main()
{
ios::sync_with_stdio(false);
int n,m;
cin >> n >> m ;
for(int i=1;i<=n;i++)
{
cin >> s[i] ;
int l=s[i].length();
last=1;
for(int j=0;j<l;j++) update(s[i][j]-'a');
}
for(int i=1;i<=n;i++)
{
int l=s[i].length(),now=1;
for(int j=0;j<l;j++)
{
now=tr[now][s[i][j]-'a'];
int t=now;
while(t&&vis[t]!=i)
{
cnt[t]++;
vis[t]=i;
t=fa[t];
}
}
}
for(int i=1;i<=m;i++)
{
cin >> ss ;
int l=ss.length(),now=1;
for(int j=0;j<l;j++) now=tr[now][ss[j]-'a'];
printf("%d\n",cnt[now]);
}
return 0;
}
小结:对后缀自动机的理解好浅啊...
[bzoj2780][Spoj8093]Sevenk Love Oimaster_广义后缀自动机的更多相关文章
- BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)
题目链接 \(Description\) 给定n个模式串,多次询问一个串在多少个模式串中出现过.(字符集为26个小写字母) \(Solution\) 对每个询问串进行匹配最终会达到一个节点,我们需要得 ...
- SP8093 JZPGYZ - Sevenk Love Oimaster(广义后缀自动机)
题意 题目链接 Sol 广义后缀自动机板子题..和BZOJ串那个题很像 首先建出询问串的SAM,然后统计一下每个节点被多少个串包含 最后直接拿询问串上去跑就行了 #include<bits/st ...
- bzoj 3277 串 && bzoj 3473 字符串 && bzoj 2780 [Spoj]8093 Sevenk Love Oimaster——广义后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3277 https://www.lydsy.com/JudgeOnline/problem.p ...
- BZOJ 2780 [Spoj]8093 Sevenk Love Oimaster ——广义后缀自动机
给定n个串m个询问,问每个串在n个串多少个串中出现了. 构建广义后缀自动机,(就是把所有字符串的后缀自动机合并起来)其实只需要add的时候注意一下就可以了. 然后对于每一个串,跑一边匹配,到达了now ...
- BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster [广义后缀自动机]
JZPGYZ - Sevenk Love Oimaster Oimaster and sevenk love each other. But recently,sevenk hea ...
- 【BZOJ2780】[Spoj]8093 Sevenk Love Oimaster 广义后缀自动机
[BZOJ2780][Spoj]8093 Sevenk Love Oimaster Description Oimaster and sevenk love each other. But r ...
- BZOJ2780:[SPOJ8093]Sevenk Love Oimaster(广义SAM)
Description Oimaster and sevenk love each other. But recently,sevenk heard that a girl named ChuYuXu ...
- BZOJ2780 [Spoj]8093 Sevenk Love Oimaster 【广义后缀自动机】
题目 Oimaster and sevenk love each other. But recently,sevenk heard that a girl named ChuYuXun was dat ...
- 【BZOJ2780】Sevenk Love Oimaster【广义后缀自动机】
题意 给出你n个字符串和q个查询,每个查询给出一个字符串s,对于每个查询你都要输出这个字符串s在上面多少个字符串中出现过. 分析 广义后缀自动机的裸题.建好SAM以后再跑一遍得到每个状态的ocu和la ...
随机推荐
- pocket API学习笔记
最近安装了pocket离线阅读软件. 为了收藏需要的URL,每次都要打开浏览器.然后按google工具条上的pocket+. 网页多的时候,这个过程就非常缓慢. 根据pocket网站的API介绍,我可 ...
- JQuery 获得绝对,相对位置的坐标方法
获取页面某一元素的绝对X,Y坐标,可以用offset()方法:(body属性设置margin :0;padding:0;) var X = $('#DivID').offset().top; var ...
- About the iOS File System
两个维度: 1)是否给用户使用: 2)是否持久存储. During installation of a new app, the installer creates a number of conta ...
- execl, execlp, execle, execv, execvp - 执行某个文件
总览 (SYNOPSIS) #include <unistd.h> extern char **environ; int execl( const char *path, const ch ...
- 微信小程序---协同工作和发布
(1)协同开发和发布 在中大型的公司里,人员的分工非常仔细,一般会有不同岗位角色的员工同时参与同一个小程序项目.为此,小程序平台设计了不同的权限管理使得项目管理者可以更加高效管理整个团队的协同工作. ...
- JavaEE-04 数据源配置
学习要点 JNDI 数据库连接池 完成新闻发布系统数据库连接池 JNDI 说明 JNDI(Java Naming and Directory Interface),中文翻译为Java命名与目录接口,是 ...
- 《3+1团队》【Alpha】Scrum meeting 4
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 3+1团队 团队博客地址 https://home.cnblogs.com/u/3-1group ...
- delphi并行压缩
real case test MM parallel 4x scalable (i7 6700)(on the newer processors will be linear) I did a sma ...
- sqlserver还原3101
1.出现错误"3101" 2.解决办法:删除数据库之后还原(有风险)或者获得数据库的独占访问权(用sql语句) 参考:https://www.2cto.com/database/2 ...
- 前端学习日记-vue cli3.0环境搭建
卸载老版本的 vue-cli : npm uninstall vue-cli -g 安装新版本的 : npm install -g @vue/cli --安装新版本cli 同时nodeJS 要更新至 ...