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出发到任意一个状态的路径对应一 ...
随机推荐
- Git从远程分支创建本地分支
git fetch origin master:temp 这句命令的意思是:将远程origin仓库的master分支下载到本地,并新建一个分支temp.
- 3.7 嵌入式SQL
可以放入所有高级语言中去,如C 因为,SQL是过程性语句,需要高级语言的非过程性处理集合的分类处理 一.一般形式 所有的SQL语句都必须加前缀EXEC SQL SQL语句完成结束标志(:或END EX ...
- FZU 2027 单词问题 map标记字符串典型问题
题目链接:单词问题 找一个字符串里的所有单词,重复的只输出一次.关于map函数key值是字符串的问题一直比较含糊... 挣扎了一番,大概是,map的key值是char型数组的时候,标记的是地址,于是有 ...
- MySQL主从数据库同步
更新中,还未测试.......
- iOS各种动画效果
ios各种动画效果 最普通动画: //开始动画 [UIView beginAnimations:nil context:nil]; //设定动画持续时间 [UIView setAnimationDu ...
- 6.1.2Linux下Socket编程
tcp简单实验 server.c #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include ...
- Xutils的使用 转载 带自己细细研究
单例模式static DbUtils db = null; public static DbUtils getDb(Context context) { if (context == null) { ...
- MATLAB图像处理函数汇总(二)
60.imnoise 功能:增加图像的渲染效果. 语法: J = imnoise(I,type) J = imnoise(I,type,parameters) 举例 I = imread('eight ...
- navtab方法参数以及事件
参数(options) DOM方式初始化navtab的,推荐使用集合属性data-options定义参数,如果使用data属性定义参数,注意转换成对应的名称. 名称 类型 默认值 描述 id stri ...
- EF学习笔记(一)
EF(EntityFramwork)实体框架:主要是将实体类(EntityClass)和数据表(Table)进行映射(Map). EF核心对象: DbContext (数据访问核心对象) ...