HDU 4622 Reincarnation 后缀自动机
模板来源:http://blog.csdn.net/zkfzkfzkfzkfzkfzkfzk/article/details/9669747
解法参考:http://blog.csdn.net/dyx404514/article/details/9631787
刚学后缀自动机,还是有很多性质不是很了解……目前也就能做个模板题orz
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm> using namespace std; #define N 2010
#define MAXQ 10010 struct Suffix_Automaton
{
int F[N << ],ant,last,ch[N << ][],step[N << ]; void init()
{
last = ant = ;
memset(F,,sizeof(F));
memset(ch,,sizeof(ch));
memset(step,,sizeof(step));
} void ins(int x)
{
int t = ++ant, pa = last;
step[t] = step[last] + ;
last = t;
for( ; pa && !ch[pa][x]; pa = F[pa] )
ch[pa][x] = t;
if( pa == ) F[t] = ;
else if( step[pa] + == step[ ch[pa][x] ] )
F[t] = ch[pa][x];
else
{
int nq = ++ant, q = ch[pa][x];
memcpy( ch[nq], ch[q], sizeof(ch[nq]) );
step[nq] = step[pa] + ;
F[nq] = F[q];
F[q] = F[t] = nq;
for( ; pa && ch[pa][x] == q; pa = F[pa] )
ch[pa][x] = nq;
}
}
};
//以上为后缀自动机模板 struct node
{
int l, r;
int id;
}; node qry[MAXQ];
char str[];
int ans[MAXQ];
Suffix_Automaton SAM; bool cmp( node a, node b )
{
if ( a.l == b.l ) return a.r < b.r;
return a.l < b.l;
} int main()
{
int T;
scanf( "%d", &T );
while ( T-- )
{
scanf( "%s", &str[] );
int Q;
scanf( "%d", &Q );
for ( int i = ; i < Q; ++i )
{
scanf("%d%d", &qry[i].l, &qry[i].r );
qry[i].id = i;
}
sort( qry, qry + Q, cmp ); int preL = qry[].l;
SAM.init();
int j = preL;
for ( int i = ; i < Q; ++i )
{
if ( qry[i].l == preL )
{
while ( j <= qry[i].r )
{
SAM.ins( str[j] - 'a' );
++j;
}
int tmp = ;
for ( int k = SAM.ant; k > ; --k )
tmp += SAM.step[k] - SAM.step[ SAM.F[k] ];
ans[ qry[i].id ] = tmp;
}
else
{
preL = qry[i].l;
j = qry[i].l;
SAM.init();
while ( j <= qry[i].r )
{
SAM.ins( str[j] - 'a' );
++j;
}
int tmp = ;
for ( int k = SAM.ant; k > ; --k )
tmp += SAM.step[k] - SAM.step[ SAM.F[k] ];
ans[ qry[i].id ] = tmp;
}
} for ( int i = ; i < Q; ++i )
printf( "%d\n", ans[i] );
}
return ;
}
推荐几篇学习后缀自动机的文章:
陈立杰课件:http://wenku.baidu.com/view/7afa5828ed630b1c59eeb512.html
推荐资料:
http://fanhq666.blog.163.com/blog/static/8194342620123352232937/
http://hi.baidu.com/myidea/item/142c5cd45901a51820e25039
http://blog.sina.com.cn/s/blog_70811e1a01014dkz.html
HDU 4622 Reincarnation 后缀自动机的更多相关文章
- HDU 4622 Reincarnation 后缀自动机 // BKDRHash(最优hash)
Reincarnation Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) P ...
- Hdu 4622 Reincarnation(后缀自动机)
/* 字符串长度较小, 可以离线或者直接与处理所有区间的答案 动态加入点的时候, 因为对于其他点的parent构造要么没有影响, 要么就是在两个节点之间塞入一个点, 对于minmax的贡献没有改变 所 ...
- Reincarnation HDU - 4622 (后缀自动机)
Reincarnation \[ Time Limit: 3000 ms\quad Memory Limit: 65536 kB \] 题意 给出一个字符串 \(S\),然后给出 \(m\) 次查询, ...
- hdu 4622 Reincarnation(后缀数组)
hdu 4622 Reincarnation 题意:还是比较容易理解,给出一个字符串,最长2000,q个询问,每次询问[l,r]区间内有多少个不同的字串. (为了与论文解释统一,这里解题思路里sa数组 ...
- HDU 4622 Reincarnation Hash解法详解
今天想学字符串hash是怎么弄的.就看到了这题模板题 http://acm.hdu.edu.cn/showproblem.php?pid=4622 刚开始当然不懂啦,然后就上网搜解法.很多都是什么后缀 ...
- HDU 4622 Reincarnation(后缀自动机)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4622 [题目大意] 给出一个长度不超过2000的字符串,有不超过10000个询问,问[L,R]子串 ...
- HDU 4622 Reincarnation (查询一段字符串的不同子串个数,后缀自动机)
Reincarnation Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- hdu 4622 Reincarnation SAM模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给定一个长度不超过2000的字符串,之后有Q次区间查询(Q <= 10000),问区 ...
- HDU 6583 Typewriter(后缀自动机)
Typewrite \[ Time Limit: 1500 ms\quad Memory Limit: 262144 kB \] 题意 给出一个字符串 \(s\),现在你需要构造出这个字符串,你每次可 ...
随机推荐
- HashMap优雅的初始化方式以及引申
小记 相信很多人和笔者一样,经常会做一些数组的初始化工作,也肯定会经常用到集合类.假如我现在要初始化一个String类型的数组,可以很方便的使用如下代码: String [] strs = {&quo ...
- 第五周&第六周
学习进度表 周数 专业学习目标 学习时间 新增代码行 博客发表量 人文方面学习 知识总结 第四周 认真掌握老师上课所讲的内容,在课外多学习一些知识 5小时 50 1 阅读 ...
- Project Facets中Dynamic Web Module无法设置2.5的解决方法
为什么将jre改到1.6,还是无法改变dynamic web module 到2.5啊 解决方法: 在工程目录下有一个.settings文件夹,打开org.eclipse.wst.common.pro ...
- 2014ACM/ICPC亚洲区牡丹江站 浙大命题
A Average Score http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5373 a班有n个人,b班有m个人,bob在a ...
- 【前端】js转码
js转码 function urlencode (str) { str = (str + '').toString(); return encodeURIComponent(str).replace( ...
- nodejs快速入门
目录: 编写第一个Node.js程序: 异步式I/O和事件循环: 模块和包: 调试. 1. 编写第一个Node.js程序: Node.js 具有深厚的开源血统,它诞生于托管了许多优秀开源项目的网站—— ...
- hadoop配置错误
经过上一周的郁闷期(拖延症引发的郁闷),今天终于开始步入正轨了.今天主要是解决hadoop配置的错误以及网络时断时续的问题. 首先说明一下之前按照这篇文章的方法配置完全没有问题,但是等我配置好了发现h ...
- 10个免费开源的JS音乐播放器插件
点这里 音乐播放器在网页设计中有时候会用到,比如一些时尚类.音乐或影视类等项目,但这些 网页播放器 插件比较少见,所以这里为大家整理一个集合,也许会有用到的时候. 下面整理的播放器有些是支持自适应的, ...
- HDU 2709 Sumsets(递推)
Sumsets http://acm.hdu.edu.cn/showproblem.php?pid=2709 Problem Description Farmer John commanded his ...
- dd大牛的《背包九讲》
P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最 ...