hdu5853 (后缀自动机)
Problem Jong Hyok and String
题目大意
给你n个字符串,有q个询问。
定义set(s)={(i,j)} 表示 s在第i个字符串中出现,且末尾位置为j。
对于一个询问,求set(Qi)=set(t) ,t的数量。
(n,q<=10^5 , 字符串总长<=10^5)
解题分析
直接将n个串塞进一个后缀自动机里面。
对于一个询问串qi,找到其在后缀自动机中出现的位置j。
则答案为len[j] - len[fail[j]] 。 (具体为什么还需要好好斟酌一下)
参考程序
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define V 100008
int ans[V];
struct sam{
int nt[V*][],f[V*],a[V*],rig[V*];
int last,sum,len;
int p,q,np,nq; void clear(){
memset(f,-,sizeof(f));
memset(a,,sizeof(a));
memset(nt,-,sizeof(nt));
last = sum = len=;
}
void insert(int ch){
len++;
if (~nt[last][ch] && a[nt[last][ch]]==len){
last=nt[last][ch]; return;
}
p=last; last=np=++sum; a[np]=a[p]+; rig[np]=;
for (;~p && !~nt[p][ch];p=f[p]) nt[p][ch]=np;
if (p==-) f[np]=;
else
{
q=nt[p][ch];
if (a[q]==a[p]+) f[np]=q;
else
{
nq=++sum; a[nq]=a[p]+;
memcpy(nt[nq],nt[q],sizeof(nt[q]));
f[nq]=f[q];
f[q]=f[np]=nq;
for (;~p && nt[p][ch]==q;p=f[p]) nt[p][ch]=nq;
}
}
}
int work(char *s,int l){
int now=;
for (int i=;i<=l;i++){
if (nt[now][s[i]-'a']==-) return ;
now=nt[now][s[i]-'a'];
}
return a[now]-a[f[now]];
}
}sam; char str[V];
void work(){
sam.clear();
int n,m;
scanf("%d %d",&n,&m);
for (int i=;i<=n;i++){
sam.len=sam.last=;
scanf("%s",str+);
int len=strlen(str+);
for (int j=;j<=len;j++) sam.insert(str[j]-'a');
}
for (int i=;i<=m;i++){
scanf("%s",str+);
int len=strlen(str+);
printf("%d\n",sam.work(str,len));
}
} int main(){
int T;
scanf("%d",&T);
for (int t=;t<=T;t++){
printf("Case #%d:\n",t );
work();
}
return ;
}
hdu5853 (后缀自动机)的更多相关文章
- BZOJ 后缀自动机四·重复旋律7
后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...
- 【Codeforces235C】Cyclical Quest 后缀自动机
C. Cyclical Quest time limit per test:3 seconds memory limit per test:512 megabytes input:standard i ...
- 【hihocoder#1413】Rikka with String 后缀自动机 + 差分
搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...
- 【BZOJ-3998】弦论 后缀自动机
3998: [TJOI2015]弦论 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2018 Solved: 662[Submit][Status] ...
- HDU 4622 Reincarnation (查询一段字符串的不同子串个数,后缀自动机)
Reincarnation Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- hihoCoder 后缀自动机三·重复旋律6
后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi ...
- hihoCoder #1445 : 后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
- 数据结构:后缀自动机 WJMZBMR讲稿的整理和注释
链接放在这里,有点难理解,至少我个人是的. 后缀自动机是一种有限状态自动机,其功能是识别字符串是否是母串的后缀.它能解决的问题当然不仅仅是判断是不是后缀这种事,跟字符串的连续子串有关的问题都可以往这个 ...
- 【SPOJ】7258. Lexicographical Substring Search(后缀自动机)
http://www.spoj.com/problems/SUBLEX/ 后缀自动机系列完成QAQ...撒花..明天or今晚写个小结? 首先得知道:后缀自动机中,root出发到任意一个状态的路径对应一 ...
随机推荐
- Binary Tree Level Order Traversal [LeetCode]
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- SAP销售订单状态修改(审核) 计划行自动产生需求,产生MD04需求
不知道业务怎么配置的,创建销售单时,一堆计划行类别,什么CN,DN...都有,但是审核后需要计划行变更为CP,这样在MD04才能看到需求. 原有逻辑是弄个后台程序,审核后调一下,更新一下计划行,这样是 ...
- TCP协议基础
IP协议是Internet上使用的一个关键协议,它的全称是Internet Protocol,即Internet协议,通常简称IP协议.通过使用IP协议,使Internet·成为一个允许连接不同类型 ...
- HTML5+CSS3学习目录
目录 第YI章 Web开发新时代 第2章 从HTML.XHTML到HTML5 第3章 创建HTML5文档 第4章 实战HTML5表单 第5章 实战HTML5画布 第6章 HTML5音频与视频 第 ...
- 最新电Call记录统计-full hash join用法
declare @time datetime set @time='2016-07-01' --最新的电Call记录统计查询--SELECT t.zuoxi1,t.PhoneCount,t.Phone ...
- Grunt设置
Grunt完成对LESS实时编译. 安装 安装grunt需要先安装node.js. 之后需要借助npm来安装grunt-cli,在cmd中npm install -g grunt-cli.(测试gru ...
- bzoj 2242: [SDOI2011]计算器
#include<cstdio> #include<iostream> #include<map> #include<cmath> #define ll ...
- POJ 3207 2-sat
题目大意: 在圆上顺时针n个点,给定m个连接,可以通过圆内或者圆外相交,问能不能找到一种方式,使这些连接的边都不相交 这里很容易看出的是,这些边只有在圆外或者圆内两种连接方式,而且必须选择其中一种 所 ...
- Microsoft Mole原理及常见问题整理
Moles与Moq(Rhino.Mocks)比较 作用范围 Moq与Rhino.Mocks这类的Mock是对Interface或AbstractClass做Mock, 而Moles是Mock整个 ...
- redis2.8--内存管理
总而言之,redis内存管理是采用主要由操作系统自主控制内存分配,辅之以简单封装,达到简单且稍微改良的性能. 内存块,标记上本块size 如上图所示, 当调用zmalloc/zmalloc时,输入参数 ...