传送门:http://hihocoder.com/problemset/problem/1445

【题解】

大概看了一天的后缀自动机,总算懂了一些

这篇文章写的非常好,诚意安利:Suffix Automaton Tutorial - Hunt Zhan

我就是看了这个大概懂了。

整个过程大概是:每次插入一个state可能会分裂原有的state的transition,就维护这个transition即可。

要用par[x]记录suffix-link是谁。

过程中可以不用记录minlen,因为$minlen[i] = maxlen[par[i]] + 1$,这点非常重要。

这题前面写了后缀自动机,然后上面像统计子树一样统计,后来发现,复杂度是$O(n * 26)$,似乎太大了,TLE了。

其实后缀自动机的每个state都含有若干子串,所有state的含有子串个数之和就是总个数了。

每个state含有子串个数为$maxlen[i] - minlen[i]$,这里把$minlen[i]$替换成$maxlen[par[i]] + 1$即可,不需要再求$minlen[i]$。

这样复杂度就差不多$O(n)$了,常数小了。

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int N = 1e6 + , M = 2e6 + ;
const int mod = 1e9+; char str[N];
struct SAM {
int ch[M][], par[M], ml[M];
int siz, rt, last;
inline void set() {
siz = rt = last = ;
memset(ch, , sizeof ch);
memset(par, , sizeof par);
memset(ml, , sizeof ml);
}
inline void extend(int c) {
int p = last, cur = ++siz;
ml[cur] = ml[p] + ;
for (; p && !ch[p][c]; p = par[p]) ch[p][c] = cur;
if(!p) par[cur] = rt;
else {
int q = ch[p][c];
if(ml[q] == ml[p] + ) par[cur] = q;
else {
int sq = ++siz;
par[sq] = par[q];
for (int i=; i<; ++i) ch[sq][i] = ch[q][i];
ml[sq] = ml[p] + ;
par[q] = par[cur] = sq;
for (; p && ch[p][c] == q; p = par[p]) ch[p][c] = sq;
}
}
last = cur;
}
}S; /*
ll f[M];
inline void dfs(int x) {
f[x] = 1;
for (int i=0; i<26; ++i) {
if(!S.ch[x][i]) continue;
dfs(S.ch[x][i]);
f[x] += f[S.ch[x][i]];
}
}
*/ int main() {
scanf("%s", str+); S.set();
for (int i=; str[i]; ++i) S.extend(str[i] - 'a');
ll ans = ;
for (int i=; i<=S.siz; ++i) {
if(i == S.rt) continue;
ans += S.ml[i] - S.ml[S.par[i]];
}
cout << ans;
return ;
}

hihocoder1445 后缀自动机二·重复旋律5的更多相关文章

  1. 【后缀自动机】hihocoder1445 后缀自动机二·重复旋律5

    解题方法提示 小Hi:本周的题目其实就是给定一个字符串S,要求出S的所有不同子串的数目.小Ho你知道如何快速求解么? 小Ho:我们最近在讨论后缀自动机,所以肯定是和后缀自动机有关!根据上周学习的SAM ...

  2. HihoCoder1445 后缀自动机二·重复旋律5(后缀自动机 子串种数)

    题意: 询问串的不同子串个数 思路: 后缀自动机每个节点表示以当前字符结尾的一系列后缀,个数为\(maxlen - minlen\),其中\(minlen = maxlen[father]\). 代码 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 2019寒假训练营寒假作业(二) MOOC的网络空间安全概论笔记部分

    视频课程--MOOC的网络空间安全概论笔记 第一章 网络空间安全概述 2001年,网络空间概念被首次提出: 网络空间安全框架: 1.设备层安全: 可通过截获电磁辐射获取计算机信息.通过硬件木马(恶意电 ...

  2. UBUNTU如何安装tar.gz版的flash

    adobe flash player的官方下载页面为:https://get.adobe.com/cn/flashplayer/ 不过近期通过APT方式以及ubuntu的软件中心都安装不了flashp ...

  3. Java中终止正在运行线程

    问题:java 中如何让一个正在运行的线程终止掉? Demo_1: class TT implements Runnable { private boolean flag = true; @Overr ...

  4. LintCode-66.二叉树的前序遍历

    二叉树的前序遍历 给出一棵二叉树,返回其节点值的前序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 返回 [1,2,3]. 挑战 你能使用非递归实现么? 标签 递归 二叉树 二叉树遍历 非递归 c ...

  5. iOS-开发过程中应用间跳转问题

  6. ZOJ 1666 G-Square Coins

    https://vjudge.net/contest/67836#problem/G People in Silverland use square coins. Not only they have ...

  7. Winform 数据绑定

    1.DataGridView数据绑定 namespace WindowsFormsApplication1 { public partial class Form1 : Form { private ...

  8. Visual Studio 2013中使用Ribbon For WPF

    1.首先需要 下载Ribbon For WPF.目前最新的版本是Microsoft Ribbon for WPF October 2010. 下载 链接: https://www.microsoft. ...

  9. .NET中SQL Server数据库连接方法

    1. 使用本机上的SQL Server Express 实例上的用户实例.       用户实例的连接创建了一个新的SQL Server 实例.此连接只能是在本地SQL Server 2005实例上并 ...

  10. BZOJ4860 Beijing2017树的难题(点分治+单调队列)

    考虑点分治.对子树按照根部颜色排序,每次处理一种颜色的子树,对同色和不同色两种情况分别做一遍即可,单调队列优化.但是注意到这里每次使用单调队列的复杂度是O(之前的子树最大深度+该子树深度),一不小心就 ...