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

题目大意:给你一个字符串s(len(s)<=250000),求f[i](i=1...len(s)),其中f[i]表示长度为i的子串在s中出现次数的最大值(即最大次数)

题解:第一道后缀自动机题,其实很多地方不是很懂。。。(贴上CLJ论文和一篇wlw推荐的确实不错的讲稿就跑

https://wenku.baidu.com/view/90f22eec551810a6f4248606.html

http://blog.sina.com.cn/s/blog_70811e1a01014dkz.html
代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
const int N=250010,M=500010;
int n,cnt,lst,son[M][26],len[M],pre[M],dp[M],in[M],f[M];
char s[N];
queue<int>q;
void add(int x)
{int p=lst,np=++cnt;len[np]=len[p]+1; f[np]=1;for (;p&&!son[p][x];p=pre[p]) son[p][x]=np;if (!p) pre[np]=1;else{int q=son[p][x];if (len[q]==len[p]+1) pre[np]=q;else{int nq=++cnt; len[nq]=len[p]+1;pre[nq]=pre[q];pre[q]=pre[np]=nq;memcpy(son[nq],son[q],sizeof son[q]);for (;son[p][x]==q;p=pre[p]) son[p][x]=nq;}}lst=np;
}
int main()
{scanf("%s",s+1);n=strlen(s+1);lst=cnt=1;for (int i=1;i<=n;i++) add(s[i]-'a');for (int i=1;i<=cnt;i++) in[pre[i]]++;for (int i=1;i<=cnt;i++) if (!in[i]) q.push(i);while (!q.empty()){int u=q.front(); q.pop();if (--in[pre[u]]==0) q.push(pre[u]);f[pre[u]]+=f[u];}for (int i=1;i<=cnt;i++) dp[len[i]]=max(dp[len[i]],f[i]);for (int i=n-1;i>=1;i--) dp[i]=max(dp[i],dp[i+1]);for (int i=1;i<=n;i++) printf("%d\n",dp[i]);return 0;
}

View Code

转载于:https://www.cnblogs.com/lujiaju6555/p/8459835.html

SPOJ NSUBSTR(后缀自动机)相关推荐

  1. SPOJ LCS 后缀自动机

    用后缀自动机求两个长串的最长公共子串,效果拔群.多样例的时候memset要去掉. 解题思路就是跟CLJ的一模一样啦. #pragma warning(disable:4996) #include< ...

  2. SPOJ 7258 (后缀自动机)

    转载:http://hzwer.com/4492.html 给一个长度不超过90000的串S,每次询问它的所有不同子串中,字典序第K小的,询问不超过500个. 搞出后缀自动机 dp处理出每个点往下走能 ...

  3. SPOJ - NSUBSTR Substrings(后缀自动机)

    题目链接:点击查看 题目大意:给出一个字符串,求出每个长度下的子串出现最多的次数 题目分析:对原串跑后缀自动机然后记录每个节点的right集合的大小就是当前节点出现的次数了,这个出现次数显然可以从子节 ...

  4. 【后缀自动机】SPOJ 1812-LCSII

    题意: 给出最多10个长度不超过100000的字符串,求他们的LCS的长度.时限是鬼畜的0.25s . 后缀自动机练习...虽然有人这么说但我并不觉得hash能过. 本题可以说是[论SAM中按step ...

  5. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)【两种做法】

    SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)[两种做法] 手动博客搬家: 本文发表于20181217 23:54:35, 原地址https: ...

  6. 【SPOJ】7258. Lexicographical Substring Search(后缀自动机)

    http://www.spoj.com/problems/SUBLEX/ 后缀自动机系列完成QAQ...撒花..明天or今晚写个小结? 首先得知道:后缀自动机中,root出发到任意一个状态的路径对应一 ...

  7. 【BZOJ2780】【SPOJ】Sevenk Love Oimaster(广义后缀自动机)

    Description 有n个大串和m个询问,每次给出一个字符串s询问在多少个大串中出现过. Solution 广义后缀自动机入门题. 其实就是在插入一个串后将last设为root即可. 然后统计每个 ...

  8. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机、状压DP)

    手动博客搬家: 本文发表于20181217 23:54:35, 原地址https://blog.csdn.net/suncongbo/article/details/85058680 人生第一道后缀自 ...

  9. spoj 1811 LCS 后缀自动机

    A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...

最新文章

  1. 搭建 VUE + NODE.JS + ElementUI 学习过程中问题总结
  2. 财务学习mysql_从零开始学 MySQL - 前言
  3. 可编程交换时代就在这里
  4. html排序按钮_插件分享 | 可进行排序扫描任务的Task Queue
  5. advanced east_SpriteKit Advanced —如何构建2,5D游戏(第二部分)
  6. 目录服务技术介绍——ADSI(五)
  7. javascript中for循环里面套定时器,始终打印结束值原因
  8. 安装Matlab2016a中文破解版教程
  9. c 汇编语言小程序100例,汇编语言100例
  10. goahead源码分析webs.c
  11. 正则表达式(一):php常用的正则匹配
  12. 定向士官计算机网络技术在部队干什么,定向培养士官是干什么的
  13. 因为此版本的应用程序不支持其项目类型(.csproj)
  14. 怎样把游戏从计算机卸载了,电脑桌面上的游戏怎么卸载,电脑桌面上的游戏怎么卸载?...
  15. 微信开发者工具如何打开企业微信小程序
  16. Android Camera开发系列:设置对焦模式模式
  17. 服务器二手硬盘和新硬盘差距,过年换新拒绝被坑 教你辨别二手固态硬盘
  18. 硬盘卡住磁头的解决办法
  19. 如何提高测试用例覆盖率
  20. QTreeWidget遍历所有子节点以及删除整个TreeWidget

热门文章

  1. java获取字典所有的key_JAVA脱水学习-java集合介绍,常用集合类
  2. android studio 触摸锁,学习AndroidStudio布局,并编写一个图案解锁demo
  3. 2019年北航OO第二单元(多线程电梯任务)总结
  4. Luogu P4774 / LOJ2721 【[NOI2018]屠龙勇士】
  5. 建筑建模学习笔记2——3DMax房屋框架建模
  6. WDA 程序文本翻译OTR
  7. C#可以对系统服务 检查增加删除启动停止重启(转)
  8. 【疑问感受】初见指针——当函数遇到指针
  9. 将表达式树转换成中缀表达式☆
  10. 使用消息中间件时,如何保证消息不丢失且仅仅被消费一次