#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. Python之基础

    # 需要导入字符编码,否则遇到中文会报错 # coding=utf-8 # 1 定义变量 a = 10 b = 2 c = a+b print(c) # 2 判断语句 score = 90 if sc ...

  2. 自定义 URL Scheme 完全指南(转载)

    iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用. 注册自定义 URL Scheme ...

  3. [C#6] 7-索引初始化器

    0. 目录 C#6 新增特性目录 1. 老版本的代码 private static void Main() { var dictionary = new Dictionary<int, stri ...

  4. CLR线程概览(一)

    托管 vs. 原生线程 托管代码在“托管线程”上执行,(托管线程)与操作系统提供的原生线程不同.原生线程是在物理机器上执行的原生代码序列:而托管线程则是在CLR虚拟机上执行的虚拟线程. 正如JIT解释 ...

  5. Linux iptables配置错误导致ORA-12535 & ORA-12170

    实验环境:       操作系统  : Red Hat Enterprise Linux Server release 5.7 (Tikanga)       数据库版本: Oracle Databa ...

  6. 机器学习之寻找KMeans的最优K

    K-Means聚类算法是最为经典的,同时也是使用最为广泛的一种基于划分的聚类算法,它属于基于距离的无监督聚类算法.KMeans算法简单实用,在机器学习算法中占有重要的地位.对于KMeans算法而言,如 ...

  7. C语言猜拳游戏

    2016年最后一篇文章 今天闲来无事Google了一段C语言写的猜拳游戏的代码(本人水平比较低,几乎是刚入门),我没做什么修改.这个switch语句里面对result的处理让我眼前一新,原来是这么玩的 ...

  8. 003.安装nginx(lnmp)

    一.下载nginx 下载nginx源码包,解压: [root@huh ~]# cd /usr/local/src/ [root@huh src]# wget http://nginx.org/down ...

  9. jedis2.4.2连接池配置说明

    大多数情况使用jedis时用的都是默认配置,但有的时候为了调优,提供应用程序的性能,那我们就要知道jedis中参数的意义. JedisPoolConfig config = new JedisPool ...

  10. Mysql 主从热备份

    工作原理 首先锁定并备份主服务器数据库,从服务器导入备份的数据库,实现两个数据库的初态一样.然后把主服务器上执行过的sql语句都记录到二进制日志 Binarylog 中,从服务器会来读取这个log, ...