HihoCoder1449 重复旋律6(后缀自动机)
描述
小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为一段数构成的数列。
现在小Hi想知道一部作品中所有长度为K的旋律中出现次数最多的旋律的出现次数。但是K不是固定的,小Hi想知道对于所有的K的答案。
输入
共一行,包含一个由小写字母构成的字符串S。字符串长度不超过 1000000。
输出
共Length(S)行,每行一个整数,表示答案。
样例输入
- aab
样例输出
- 2
- 1
- 1
1,很好的利用了拓扑。
2,利用了单调性。
- for(i=tot;i>;i--){
- ans[i]=max(ans[i],ans[i+]);
- }
2017-11-24 代码是舶来品,参考hihocoder,等把后缀自动机消化了自己再写一遍吧。
2017-11-25 这几个题理解得差不多了。
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #include<string>
- #include<queue>
- using namespace std;
- typedef long long ll;
- const int inf=0x3f3f3f3f;
- const int N=1e6+;
- const int M=1e6+;
- int tot,slink[*N],trans[*N][],minlen[*N],maxlen[*N],edpts[*N],n;
- char str[*N];
- int blue[*N],ind[*N],ans[*N+];
- int newstate(int _maxlen,int _minlen,int* _trans,int _slink) {
- maxlen[++tot]=_maxlen;
- minlen[tot]=_minlen;
- slink[tot]=_slink;
- if(_trans)
- for(int i=; i<; i++)
- trans[tot][i]=_trans[i];
- return tot;
- }
- int add(char ch,int u) {
- int c=ch-'a',v=u;
- int z=newstate(maxlen[u]+,-,NULL,);
- blue[z]=;//绿色
- while(v&&!trans[v][c]) {
- trans[v][c]=z;
- v=slink[v];
- }
- if(!v) {
- minlen[z]=;
- slink[z]=;
- ind[]++;
- return z;
- }
- int x=trans[v][c];
- if(maxlen[v]+==maxlen[x]) {
- slink[z]=x;
- minlen[z]=maxlen[x]+;
- ind[x]++;
- return z;
- }
- int y=newstate(maxlen[v]+,-,trans[x],slink[x]);
- slink[z]=slink[x]=y;
- ind[y]+=;
- minlen[x]=minlen[z]=maxlen[y]+;
- while(v&&trans[v][c]==x) {
- trans[v][c]=y;
- v=slink[v];
- }
- minlen[y]=maxlen[slink[y]]+;
- return z;
- }
- void count() {
- queue<int> q;
- for( int i=; i <=tot; i++ )if( !ind[i] ) {
- q.push(i);
- }
- while( !q.empty() ) {
- int u = q.front();
- q.pop();
- if(blue[u] ) edpts[u]++;
- edpts[ slink[u]] += edpts[u];
- if( !--ind[slink[u]] ) q.push(slink[u]);
- }
- }
- int main() {
- int i;
- scanf("%s",str);
- int len=strlen(str),pre=;
- tot=;
- for(i=; i<len; i++) {
- pre=add(str[i],pre);
- }
- count();
- for(i=;i<=tot;i++){
- ans[maxlen[i]] = max(ans[maxlen[i]],edpts[i]);
- }
- for(i=tot;i>;i--){
- ans[i]=max(ans[i],ans[i+]);
- }
- for(i=;i<=len;i++)printf("%d\n",ans[i]);
- return ;
- }
HihoCoder1449 重复旋律6(后缀自动机)的更多相关文章
- hihoCoder.1465.后缀自动机五 重复旋律8(后缀自动机)
题目链接 \(Description\) 给定母串S,求模式串的循环同构串在S中的出现次数. \(Solution\) 将模式串s复制一遍,在母串的SAM上匹配,记录以每个位置作为后缀所能匹配的最大长 ...
- hihoCoder 1403 后缀数组一·重复旋律(后缀数组+单调队列)
#1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成 ...
- 【HIHOCODER 1403】后缀数组一·重复旋律(后缀数组)
描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列. 小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律.旋律是一段连续的数列,相似的旋律在原数列 ...
- HihoCoder 重复旋律
あの旋律を何度も繰り返しでも.あの日見た光景を再現できない 无论将那段旋律重复多少次,也无法重现那一日我们看到的景象 もし切ないならば.時をまきもどしてみるかい? 若是感到惆怅的话,要试着让时光倒流吗 ...
- 【后缀自动机】hihocoder1449 后缀自动机三·重复旋律6
解题方法提示 小Hi:上次我们已经学习了后缀自动机了,今天我们再来解决一个用到后缀自动机的问题. 小Ho:好!那我们开始吧! 小Hi:现在我们要对K=1..length(S)求出所有长度为K的子串中出 ...
- HihoCoder1449 后缀自动机三·重复旋律6
描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi想知道一部作品中所有长度为K的旋律中出现次数最多的旋律的出现次数.但是K不是固定的,小Hi想知道对 ...
- BZOJ 后缀自动机四·重复旋律7
后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...
- hihoCoder 后缀自动机三·重复旋律6
后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi ...
- hihoCoder #1445 : 后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
随机推荐
- BigDecimal类型、Long类型判断值是否相等,以及BigDecimal加减乘除
//Long是需要比较精度的,所以要用longValueif(project.getFriendId().longValue() != friendId.longValue()) { return t ...
- (C#)ListView双击Item事件
/// <summary> /// 双击选择播放列表项进行播放 /// </summary> /// <param name="sender"> ...
- JavaScript:学习笔记(1)——在HTML中使用JS
在HTML中使用JavaScript <script>元素 1.直接在网页中嵌入JS代码 说明: 请不要在代码的任何地方出现</script>字符串 这是由于解析嵌入式代码的规 ...
- PHP生成缩略图,控制图片质量,支持.png .jpg .gif
namespace common\components; class ResizeImageHelper { public $type;//图片类型 public $width;//实际宽度 publ ...
- asp.net 文件上传
前台js <script type="text/javascript"> window.onload = function () { document.getEleme ...
- Swift进阶 - 12个技巧
听说你已经学习Swift几个月了,有没有想更进一步成为Swift高手的想法?我这里有11招秘技,各位施主且听我慢慢道来,结个善缘. 1. 扩展(Extension) 任务: 求数字的平方. // 菜鸟 ...
- Hibernate_HelloWord
Hibernate操作步骤 1.新建项目 2.加jar包 3.写XML配置文件hibernate.cfg.xml 4.写log4j.properties日志文件 5.在MySql数据库中建studen ...
- JavaScript笔记01——数据存储(包括.js文件的引用)
While, generally speaking, HTML is for content and CSS is for presentation, JavaScript is for intera ...
- Object.defineProperty小解
最早认识这个函数,源于对vue双向绑定的探索,vue通过这个函数实现属性挟持并结合发布者-订阅者模式实现双向绑定 先看一个实例: var o= {name: 'a'} Object.definePro ...
- iOS面试必备-iOS基础知识
近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内 ...