SPOJ 8222 Substrings(后缀自动机)
【题目链接】 http://www.spoj.com/problems/NSUBSTR/
【题目大意】
给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值。
求出所有的F。
【题解】
在SAM中,一个串出现的次数就是|Right(s)|,我们按长度从小到大分配内存单位,
从后往前计算可以获得Right值大小,用所有的Right去更新相应长度的答案即可。
【代码】
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int N=500005;
- char s[N];
- struct sam{
- int p,q,np,nq,cnt,last,a[N][26],l[N],f[N];
- sam(){cnt=0;last=++cnt;}
- void extend(int c){
- p=last;np=last=++cnt;l[np]=l[p]+1;
- while(!a[p][c]&&p)a[p][c]=np,p=f[p];
- if(!p)f[np]=1;
- else{
- q=a[p][c];
- if(l[p]+1==l[q])f[np]=q;
- else{
- nq=++cnt;l[nq]=l[p]+1;
- memcpy(a[nq],a[q],sizeof(a[q]));
- f[nq]=f[q]; f[np]=f[q]=nq;
- while(a[p][c]==q)a[p][c]=nq,p=f[p];
- }
- }
- }int b[N],x[N],r[N];
- void build(){
- scanf("%s",s+1);
- int len=strlen(s+1);
- for(int i=1;i<=len;i++)extend(s[i]-'a');
- for(int i=1;i<=cnt;i++)b[l[i]]++;
- for(int i=1;i<=len;i++)b[i]+=b[i-1];
- for(int i=1;i<=cnt;i++)x[b[l[i]]--]=i;
- for(int i=p=1;i<=len;i++){p=a[p][s[i]-'a'];r[p]++;}
- for(int i=cnt;i;i--)r[f[x[i]]]+=r[x[i]];
- }
- int F[N];
- void CalF(){
- int len=strlen(s+1);
- for(int i=1;i<=cnt;i++)F[l[i]]=max(F[l[i]],r[i]);
- for(int i=1;i<=len;i++)printf("%d\n",F[i]);
- }
- }sam;
- int main(){
- sam.build();
- sam.CalF();
- return 0;
- }
SPOJ 8222 Substrings(后缀自动机)的更多相关文章
- spoj 8222 Substrings (后缀自动机)
spoj 8222 Substrings 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) 解题思路:我们构造S的SAM,那么对于 ...
- SPOJ NSUBSTR Substrings 后缀自动机
人生第一道后缀自动机,总是值得纪念的嘛.. 后缀自动机学了很久很久,先是看CJL的论文,看懂了很多概念,关于right集,关于pre,关于自动机的术语,关于为什么它是线性的结点,线性的连边.许多铺垫的 ...
- SPOJ NSUBSTR Substrings ——后缀自动机
建后缀自动机 然后统计次数,只需要算出right集合的大小即可, 然后更新f[l[i]]和rit[i]取个max 然后根据rit集合短的一定包含长的的性质,从后往前更新一遍即可 #include &l ...
- spoj 1812 lcsII (后缀自动机)
spoj 1812 lcsII (后缀自动机) 题意:求多个串的lcs,最多10个串,每个串最长10w 解题思路:后缀自动机.先建好第一个串的sam,然后后面的串拿上去跑(这个过程同前一题).sam上 ...
- ●SPOJ 8222 NSUBSTR–Substrings(后缀自动机)
题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 后缀自动机的水好深啊!懂不了相关证明,带着结论把这个题做了.看来这滩深水要以后再来了. 本题要用到一个叫 R ...
- SPOJ 8222. Substrings(后缀自动机模板)
后缀自动机+dp. 后缀自动机主要是在functioner大牛那里学习的:http://blog.sina.com.cn/s/blog_70811e1a01014dkz.html 这道题是在No_st ...
- Substrings SPOJ - NSUBSTR (后缀自动机)
Substrings \[ Time Limit: 100ms\quad Memory Limit: 1572864 kB \] 题意 给出一个长度为 \(250000\) 的字符串,求出所有 \(x ...
- POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀自动机)
题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 确实比后缀数组快多了(废话→_→). \(Description\) 求两个字符串最长公共子串 ...
- 【CF316G3】Good Substrings 后缀自动机
[CF316G3]Good Substrings 题意:给出n个限制(p,l,r),我们称一个字符串满足一个限制当且仅当这个字符串在p中的出现次数在[l,r]之间.现在想问你S的所有本质不同的子串中, ...
- Lexicographical Substring Search SPOJ - SUBLEX (后缀自动机)
Lexicographical Substrings Search \[ Time Limit: 149 ms \quad Memory Limit: 1572864 kB \] 题意 给出一个字符串 ...
随机推荐
- Windows 去掉启动时的放大镜
控制面板-轻松访问中心-使计算机更易于显示不勾选 启用放大镜
- whereis linux文件搜索
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis查找的速度非 ...
- 程序员眼里IE浏览器是什么样的
主流浏览器之争从上个世纪开就开始,已经持续了很长的时间.就在几年前,IE还是最主流的web浏览器.但现在形势完全不同了,人们都在笑话IE,纷纷转向其它浏览器.今天,我向大家分享一下针对IE的搞笑图片, ...
- Case when 的用法,简单Case函数
Case when 的用法,简单Case函数 简单CASE表达式,使用表达式确定返回值. 语法: CASE search_expression WHEN expression1 THEN result ...
- Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口
Surface Pro 4 和 Surface Book 使用名为 Surface UEFI(统一可扩展固件接口)的新固件接口.Surface UEFI 提供新功能,如启动更快速.安全性更高.可替换 ...
- 鼠标进入与离开的消息(覆盖CM_MOUSEENTER与CM_MOUSELEAVE消息)——Windows本身没有这样的消息
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ...
- android权限列表
原文:[转]android权限列表 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略 ...
- CC++初学者编程教程(2) Microsoft Visual C++ 6.0开发环境搭建
上一篇演示的是如何安装VS2010,本文演示的是如何安装Microsoft Visual C++ 6.0 简称VC6. 有同学经常VC6都是很古董的版本了,为啥他还存在,不得不说VC6是微软一个很经典 ...
- 神奇的i=i++
最近在看c语言,被神奇的i=i++吸引,其实感觉编程是一件有趣的事情(特别喜欢算法).下面是我的测试,linux 下 gcc编译 #include<stdio.h> main () { ...
- java--jsp+ssh+select动态结合数据和选择(解)
在三层体系结构和jsp合并项目,如何实现select动态绑定数据和动态选择指定的行?让我们来看看下面的: 1.首先定义一个Bean分类.它用于实例select的结合数据中的每一个id和name: pu ...