题目:http://www.spoj.com/problems/NSUBSTR/

题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值。求F(1)..F(Length(S))

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int N=250005;
struct State
{
State *pre,*go[26];
int step,v;
void clear()
{
v=0;
pre=0;
step=0;
memset(go,0,sizeof(go));
}
}*root,*last;
State statePool[N*2],*b[2*N],*cur;
void init()
{
cur=statePool;
root=last=cur++;
root->clear();
}
void Insert(int w)
{
State *p=last;
State *np=cur++;
np->clear();
np->step=p->step+1;
while(p&&!p->go[w])
p->go[w]=np,p=p->pre;
if(p==0)
np->pre=root;
else
{
State *q=p->go[w];
if(p->step+1==q->step)
np->pre=q;
else
{
State *nq=cur++;
nq->clear();
memcpy(nq->go,q->go,sizeof(q->go));
nq->step=p->step+1;
nq->pre=q->pre;
q->pre=nq;
np->pre=nq;
while(p&&p->go[w]==q)
p->go[w]=nq, p=p->pre;
}
}
last=np;
}
char str[N];
int cnt[N];
int dp[N];
int main()
{
int n,m;
while(~scanf("%s",str))
{
n=strlen(str);
init();
for(int i=0; i<n; i++)
Insert(str[i]-'a');
memset(cnt,0,sizeof(cnt));
for(State *p=statePool; p!=cur; p++)
cnt[p->step]++;
for(int i=1; i<=n; i++)
cnt[i]+=cnt[i-1];
for(State *p=statePool; p!=cur; p++)
b[--cnt[p->step]]=p;
for(int i=0;i<n;i++)
{
int x=str[i]-'a';
root=root->go[x];
root->v++;
}
memset(dp,0,sizeof(dp));
int num=cur-statePool;
for(int i=num-1;i>0;i--)
{
dp[b[i]->step]=max(dp[b[i]->step],b[i]->v);
if(b[i]->pre) b[i]->pre->v += b[i]->v;
}
for(int i=n-1;i>0;i--)
dp[i]=max(dp[i],dp[i+1]);
for(int i=1;i<=n;i++)
printf("%d\n",dp[i]);
}
return 0;
}

SPOJ8222(后缀自动机--出现次数最多的子串)相关推荐

  1. 求一个字符串中连续出现的次数最多的子串

    求一个字符串中连续出现的次数最多的子串.例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复 ...

  2. 求一个字符串中连续出现次数最多的子串

    http://blog.csdn.net/imcdragon/article/details/6838565解答二 http://hi.baidu.com/icyday315/item/040aada ...

  3. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  4. HDU - 4622 Reincarnation(后缀自动机-查询区间本质不同子串个数)

    题目链接:点击查看 题目大意:给出一个长度为 n 的字符串,再给出 q 个询问,每次询问需要回答区间 [ l , r ] 内有多少个本质不同的子串 题目分析:和回文自动机那个题目一样,n * n 预处 ...

  5. SPOJ7258(后缀自动机--第k大的子串)

    题目:http://www.spoj.com/problems/SUBLEX/ 题意:给一个字符串,然后给Q个询问,每个询问输入一个数K,输出子串中字典序为K的字符串. #include <io ...

  6. 不在B中的A的子串数量 HDU - 4416 (后缀自动机模板题目)

    题目: 给定一个字符串a,又给定一系列b字符串,求字符串a的子串不在b中出现的个数. 题解: 先将所有的查询串放入后缀自动机(每次将sam.last=1)(算出所有子串个数) 然后将母串放入后缀自动机 ...

  7. hihocoder 后缀自动机专题

    一.后缀自动机基本概念的理解 1.首先后缀自动机的状态是由子串的endpos来决定的 子串的endpos是指一个子串可以在原字符串的哪些位置进行匹配, endpos构成的不同集合划分成不同的状态 关于 ...

  8. 后缀自动机Suffix Links的应用

    前置: 后缀自动机SAM基本概念:https://blog.csdn.net/Jaihk662/article/details/82823251 后缀自动机线性构造方法:https://blog.cs ...

  9. 【算法竞赛学习笔记】后缀自动机SAM-超经典的字符串问题详解

    title : 后缀自动机 date : 2021-11-11 tags : ACM,字符串 author : Linno 前置知识 KMP,Trie,AC自动机等字符串基础 DFA(有限状态自动机) ...

最新文章

  1. Mac升级到EI Captain之后pip install 无法使用问题
  2. SDK目录结构和adb工具及命令介绍
  3. kswapd0 挖矿_bioset linux_linux bioset 进程 腾讯云
  4. php项目私有化部署保护代码,ThinkPHP项目安全配置解决方案
  5. js动态创建样式style
  6. 搜索引擎技术之网络爬虫
  7. 信息学奥赛一本通 2016:【例4.1】for循环求和
  8. scp传服务器文件,使用tar、scp和screen在服务器之间传输文件
  9. perf 函数调用性能(函数流程图)
  10. [Android 9.0][RK3399/RK3328] Settings->Factory Reset:点击恢复出场设置崩溃的问题
  11. 2020考研初试成绩2月中旬起陆续公布,6点需注意
  12. android 4.4 投屏,安卓投屏助手官方
  13. HMS Core Insights第三期直播预告—— 当我们在谈论App的时候,我们还可以谈论什么?
  14. 如何批量打印dwf文件
  15. 步态情绪识别:STEP学习
  16. 学习笔记—什么是微数据?itemscope/itemtype/itemprop(搜索引擎seo优化)
  17. PHP是TM最美的语言,我的文章是最棒的狗粮
  18. 卷妹的成长日记之javaweb day2
  19. 如何在服务里面删除应用(比如说删除掉服务里面的tomcat)?
  20. vue 中生成二维码,合成海报

热门文章

  1. 利用模板模式重构JDBC操作
  2. 微信支付 - 构建商户端支付成功的回调接口
  3. Spring集成web环境步骤
  4. IDEA下SVN基本使用
  5. 自定义注解事务课程回顾
  6. log4j2.xml
  7. ExecutorService- Future - Java多线程编程
  8. 电脑装服务器系统好处,服务器选用Linux系统的几个好处
  9. view 注册服务器,view服务器ip地址
  10. eclipse中快捷键