#1445 : 后缀自动机二·重复旋律5

时间限制:10000ms
单点时限:2000ms
内存限制:256MB

描述

小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的更多相关文章

  1. hihoCoder_1445_后缀自动机二·重复旋律5

    #1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...

  2. hiho一下第128周 后缀自动机二·重复旋律5

    #1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...

  3. hiho一下第131周 后缀自动机二·重复旋律8(循环相似子串)

    后缀自动机五·重复旋律8 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 小Hi ...

  4. hiho一下第130周 后缀自动机二·重复旋律7

    后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...

  5. hiho一下第129周 后缀自动机二·重复旋律6

    后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi ...

  6. hihocoder #1407 : 后缀数组二·重复旋律2

    #1407 : 后缀数组二·重复旋律2 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...

  7. hihocoder 后缀自动机二·重复旋律5

    求不同子串个数 裸的后缀自动机 #include<cstring> #include<cmath> #include<iostream> #include<a ...

  8. hihoCoder #1465 : 后缀自动机五·重复旋律8

    http://hihocoder.com/problemset/problem/1465 求S的循环同构串在T中的出现次数 将串S变成SS 枚举SS的每个位置i,求出以i结尾的SS的子串 与 T的最长 ...

  9. hihocoder1445 后缀自动机二·重复旋律5

    传送门:http://hihocoder.com/problemset/problem/1445 [题解] 大概看了一天的后缀自动机,总算懂了一些 这篇文章写的非常好,诚意安利:Suffix Auto ...

随机推荐

  1. android中的线程池学习笔记

    阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...

  2. CocoaPods 导入第三方库头文件自动补齐

    使用了一段时间CocoaPods来管理Objective-c的类库,方便了不少.但是有一个小问题,当我在xcode输入import关键字的时候,没有自动联想补齐代码的功能,需要手工敲全了文件名,难以适 ...

  3. fillStyle径向渐变

    <!DOCTYPE HTML> <head> <meta charset = "utf-8"> <title>canvas</ ...

  4. 如何查看Oracle客户端版本

    在实际工作中,总会遇到一些需要查看.验证ORACLE客户端版本的问题,因为一台服务器可能装了多个Oracle客户端版本:也有可能你需要知道安装的版本是32位还是64位的.如何查看Oracle客户端(O ...

  5. Linux 硬盘分区生效命令partprobe

    在Linux中使用fdisk命令进行分区时,有时会遇到"WARNING: Re-reading the partition table failed with error 16: Devic ...

  6. SSH之免密码登录

    我的虚拟机: 192.168.91.130  test1 192.168.91.131  test2 192.168.91.132  test3 1.首先在test1上生成秘钥对 之后会生成.shh/ ...

  7. .NET项目开发—浅谈面向对象的纵横向关系、多态入口,单元测试(项目小结)

    阅读目录: 1.开篇介绍 2.使用委托消除函数串联调用 2.1.使用委托工厂转换两个独立层面的对象 3.多态入口(面向对象继承体系是可被扩展的) 4.多态的受保护方法的单元测试(Protected成员 ...

  8. 关于datetime 和 int 之间相互转换

    在其他地方看到一个有点意思的东西.是记录转换规则的. DECLARE @Date1 DATETIME = '2016-06-21 11:53:00' , @Date2 DATETIME = '2016 ...

  9. C++的友元类和友元函数实例

    #include <math.h> #include<iostream> using namespace std; class Point { public: Point(do ...

  10. Android APP 读取 AndroidManifest.xml 中的版本信息详解

    APP都会涉及到版本的问题,Android APP的版本信息保存在AndroidManifest.xml文件的顶部.如下图: 有2个属性表示,“android:versionCode”和“androi ...