hihoCoder #1445 : 后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5
描述
小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为一段数构成的数列。
现在小Hi想知道一部作品中出现了多少不同的旋律?
输入
共一行,包含一个由小写字母构成的字符串。字符串长度不超过 1000000。
输出
一行一个整数,表示答案。
- 样例输入
-
aab
- 样例输出
-
5
后缀自动机,学习了最短路的转移。
/*************************************************************************
> File: main.cpp
> Author: You Siki
> Mail: You.Siki@outlook.com
> Time: 2016年12月23日 星期五 14时25分55秒
************************************************************************/ #include<bits/stdc++.h> //using namespace std; const int maxn = ; /* AUTOMATON */ int last = ;
int tail = ;
int step[maxn];
int fail[maxn];
int mini[maxn];
int next[maxn][]; inline void buildAutomaton(char *s)
{
while (*s)
{
int p = last;
int t = tail++;
int c = *s++ - 'a';
step[t] = step[p] + ;
while (p && !next[p][c])
next[p][c] = t, p = fail[p];
if (p)
{
int q = next[p][c];
if (step[q] == step[p] + )
fail[t] = q, mini[t] = step[q] + ;
else
{
int k = tail++;
fail[k] = fail[q];
fail[q] = fail[t] = k;
step[k] = step[p] + ;
mini[q] = step[k] + ;
mini[t] = step[k] + ;
for (int i = ; i < ; ++i)
next[k][i] = next[q][i];
while (p && next[p][c] == q)
next[p][c] = k, p = fail[p];
mini[k] = step[fail[k]] + ;
}
}
else
fail[t] = , mini[t] = ;
last = t;
}
} inline long long solve(void)
{
long long ret = ;
for (int i = ; i < tail; ++i)
ret += step[i] - mini[i] + ;
return ret;
} /* MAIN FUNC */ char str[maxn]; signed main(void)
{
scanf("%s", str);
buildAutomaton(str);
printf("%lld\n", solve());
}
20170222 复习SAM模板
#include <cstdio>
#include <cstring> const int siz = ; int last = ;
int tail = ;
int mini[siz];
int maxi[siz];
int fail[siz];
int next[siz][]; inline void build(char *s)
{
while (*s)
{
int p = last;
int t = tail++;
int c = *s++ - 'a'; maxi[t] = maxi[p] + ; while (p && !next[p][c])
next[p][c] = t, p = fail[p]; if (p)
{
int q = next[p][c]; if (maxi[q] == maxi[p] + )
fail[t] = q, mini[t] = maxi[q] + ;
else
{
int k = tail++; fail[k] = fail[q];
fail[t] = fail[q] = k;
maxi[k] = maxi[p] + ;
mini[q] = maxi[k] + ;
mini[t] = maxi[k] + ;
mini[k] = maxi[fail[k]] + ; memcpy(next[k], next[q], * sizeof(int)); while (next[p][c] == q)
next[p][c] = k, p = fail[p];
}
}
else
fail[t] = , mini[t] = ; last = t;
}
} inline void calc(void)
{
long long ans = ; for (int i = ; i < tail; ++i)
ans += maxi[i] - mini[i] + ; printf("%lld\n", ans);
} signed main(void)
{
static char s[siz]; scanf("%s", s); build(s); calc();
}
@Author: YouSiki
hihoCoder #1445 : 后缀自动机二·重复旋律5的更多相关文章
- hihoCoder_1445_后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
- hiho一下第128周 后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
- hiho一下第131周 后缀自动机二·重复旋律8(循环相似子串)
后缀自动机五·重复旋律8 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 小Hi ...
- hiho一下第130周 后缀自动机二·重复旋律7
后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...
- hiho一下第129周 后缀自动机二·重复旋律6
后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi ...
- hihocoder #1407 : 后缀数组二·重复旋律2
#1407 : 后缀数组二·重复旋律2 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...
- hihocoder 后缀自动机二·重复旋律5
求不同子串个数 裸的后缀自动机 #include<cstring> #include<cmath> #include<iostream> #include<a ...
- hihoCoder #1465 : 后缀自动机五·重复旋律8
http://hihocoder.com/problemset/problem/1465 求S的循环同构串在T中的出现次数 将串S变成SS 枚举SS的每个位置i,求出以i结尾的SS的子串 与 T的最长 ...
- hihocoder1445 后缀自动机二·重复旋律5
传送门:http://hihocoder.com/problemset/problem/1445 [题解] 大概看了一天的后缀自动机,总算懂了一些 这篇文章写的非常好,诚意安利:Suffix Auto ...
随机推荐
- IOS开发之功能模块--输入框随着键盘的位置移动而移动
废话不多说,先直接上效果图: 先熟悉一下在Cocoa框架中会用到的key键: 然后直接上Demo的源码截图: 看代码之前,补充说一句,Demo中的文本框以及文本框的背后灰色的View是通过storyb ...
- scrollWidth,clientWidth,offsetWidth的区别
通过一个demo测试这三个属性的差别. 说明: scrollWidth:对象的实际内容的宽度,不包边线宽度,会随对象中内容超过可视区后而变大. clientWidth:对象内容的可视区的宽度,不包 ...
- 敏捷开发XP
一.组建XP团队 在XP团队中,由以下组成 二.项目相关环境 1.利益相关者:与PM一样,对项目进行管理 2.执行发起人:最终客户(必须定期演示) 三.XP组成 四.思考 1.结 ...
- Ubuntu如何选择更新源
刚装上Ubuntu, 决定先更新一下源. 虽然网上搜索提供了很多更新源,结果替换上实际使用的时候,却发现总是有404无法连接的情况. 后来查查资料,发现Ubuntu自己就提供了很多的源管理. 具体更新 ...
- sublime text3的一些插件安装方法和使用
sublime text部分插件使用方法在线安装package Control的方法: ctrl+~ 输入如下代码: import urllib2,os; pf='Package ...
- 【Windows编程】系列第二篇:Windows SDK创建基本控件
在Win32 SDK环境下,怎么来创建常用的那些基本控件呢?我们知道如果用MFC,简单的拖放即可完成大多数控件的创建,但是我们既然是用Windows SDK API编程,当然是从根上解决这个问题,实际 ...
- ffmpeg编译常规大全
其中有需要CMake的,可以直接sudo apt-get install cmake 编译yasm wget http://www.tortall.net/projects/yasm/releas ...
- Eclipse导入MyEclipse创建的web项目报错的解决方法
将myeclipse中开发的动态web项目直接引入到eclipse中继续开发,Eclipse中会报项目有错,如下图
- UVA - 1025 A Spy in the Metro[DP DAG]
UVA - 1025 A Spy in the Metro Secret agent Maria was sent to Algorithms City to carry out an especia ...
- Log4j
[1]从零开始 a). 新建Java Project>>新建package>>新建java类: b). import jar包(一个就够),这里我用的是log4j-1.2.14 ...