SPOJ bsubstr
题目大意:给你一个长度为n的字符串,求出所有不同长度的字符串出现的最大次数。
n<=250000
如:abaaa
输出:
4
2
1
1
1
spoj上的时限卡的太严,必须使用O(N)的算法那才能过掉,所以采用后缀自动机解决。
一个字符串出现的次数,即为后缀自动机中该字符串对应的节点的right集合的大小,right集合的大小等于子树中叶子节点的数目。
令dp[i]表示长度为i的字符串出现的最大次数。dp[i]可以通过在后缀链接树中从叶子节点到根节点依次求出。
最后,按长度从大到小,用dp[i]去更新dp[i-1]。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define MAXN 250005
#define MAXC 26
struct node
{
int go[MAXC],sufflink,step,right;
void clear()
{memset(go,,sizeof go);
sufflink=step=right=;
}
}tree[MAXN<<];
int dp[MAXN],cnt[MAXN],rk[MAXN<<],root,tot,cur,last,len,ans;
char s[MAXN];
void insert(int val)
{
int p,q;
tree[last].go[val]=++tot;
cur=tot;
tree[cur].clear();
tree[cur].step=tree[last].step+;
tree[cur].right++;
for(p=tree[last].sufflink;p&&tree[p].go[val]==;p=tree[p].sufflink)
tree[p].go[val]=cur;
if(p==)
tree[cur].sufflink=root;
else
{
q=tree[p].go[val];
if(tree[p].step+==tree[q].step)
tree[cur].sufflink=q;
else
{
tree[++tot].clear();
tree[tot]=tree[q];
tree[tot].right=;
tree[tot].step=tree[p].step+;
tree[cur].sufflink=tree[q].sufflink=tot;
for(;tree[p].go[val]==q;p=tree[p].sufflink)
tree[p].go[val]=tot;
}
}
last=cur;
}
void calc()
{
int temp;
for(int i=;i<=tot;i++)cnt[tree[i].step]++;
for(int i=;i<=len;i++)cnt[i]+=cnt[i-];
for(int i=;i<=tot;i++)rk[cnt[tree[i].step]--]=i;
for(int i=tot;i>;i--)
{
temp=tree[rk[i]].sufflink;
if(tree[rk[i]].right>dp[tree[rk[i]].step])dp[tree[rk[i]].step]=tree[rk[i]].right;
if(temp)tree[temp].right+=tree[rk[i]].right;
}
for(int i=len-;i>=;i--)
if(dp[i+]>dp[i])dp[i]=dp[i+];
for(int i=;i<=len;i++)
printf("%d\n",dp[i]);
}
int main()
{
while(~scanf("%s",s))
{
root=last=cur=tot=;
tree[].clear();
memset(dp,,sizeof dp);
memset(cnt,,sizeof cnt);
len=strlen(s);
for(int i=;i<len;i++)
insert(s[i]-'a');
calc();
}
return ;
SPOJ bsubstr的更多相关文章
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- SPOJ DQUERY D-query(主席树)
题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...
- SPOJ GSS3 Can you answer these queries III[线段树]
SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
- 【SPOJ 7258】Lexicographical Substring Search
http://www.spoj.com/problems/SUBLEX/ 好难啊. 建出后缀自动机,然后在后缀自动机的每个状态上记录通过这个状态能走到的不同子串的数量.该状态能走到的所有状态的f值的和 ...
- 【SPOJ 1812】Longest Common Substring II
http://www.spoj.com/problems/LCS2/ 这道题想了好久. 做法是对第一个串建后缀自动机,然后用后面的串去匹配它,并在走过的状态上记录走到这个状态时的最长距离.每匹配完一个 ...
- 【SPOJ 8222】Substrings
http://www.spoj.com/problems/NSUBSTR/ clj课件里的例题 用结构体+指针写完模板后发现要访问所有的节点,改成数组会更方便些..于是改成了数组... 这道题重点是求 ...
- SPOJ GSS2 Can you answer these queries II
Time Limit: 1000MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Description Being a ...
- SPOJ 3273
传送门: 这是一道treap的模板题,不要问我为什么一直在写模板题 依旧只放代码 Treap 版 //SPOJ 3273 //by Cydiater //2016.8.31 #include < ...
随机推荐
- 第三次作业——for 语句及分支结构else-if
1.本次学习到的知识点: (1)else-if的一般形式:if(表达式1)语句1:else if(表达式2)语句2:........else if(表达式n-1)语句n-1:else语句n: (2)遇 ...
- Linux 知识框架
Linux要点 一.Linux的基本要求 1. 掌握至少50个以上的常用命令. 2. 熟悉Gnome/KDE等X-windows桌面环境操作 . 3. 掌握.tgz..rpm等软件包的常用安装方法 4 ...
- OD调试15
可以达到不脱壳的妙用.含义:把补丁写入程序代码,就叫内嵌补丁 那我们先看看今天的程序 是一个写DVD目录的程序,点continue就可以进入使用了 发现一个还有29天 就过期了 ,点en ...
- NSUserDefaults
一.了解NSUserDefaults以及它可以直接存储的类型二.使用 NSUserDefaults 存储自定义对象1.将自定义类型转换为NSData类型2.将自定义类型数据存入 NSUserDefau ...
- ftpget 从Windows FTP服务端获取文件
/********************************************************************************* * ftpget 从Windows ...
- memcache命中统计
把memcache.php放在可以访问的位置,默认账户admin,密码admin 参考http://a.linji.cn/2011/12/memcachedphp.txt http://linji.c ...
- 问题:https与http有什么区别啊?
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息.它使用安全套接字 ...
- Linux指令小结
1.apt指令集:是ubuntu中最强大的命令行软件管理工具,用于获取.安装.编译.卸载和查询软件包.还可以检查软件包的依赖关系.在ubunt中下载是根据/etc/apt/sources.list这个 ...
- CPU的栈机制的一个小问题
比如要实现下面这个功能. 我们如果要在10000H处写入自行数据2266H,不能用“mov 内存单元, 寄存器”这类指令.怎么做? 代码: mov ax, 1000h mov ss, ax mov s ...
- Android深度探索HAL和驱动开发(卷1) 第一章 Android系统移植和驱动开发
由于Android是基于Linux内核的,因此,Android和其他Linux系统的核心部分差异非常小.然而不同版本的Android使用的Linux内核的版本有细微的差异,所以不同Android驱动可 ...