题意:求子串个数

SAM中每个子串包含于某一个状态中

对于不同的状态\(u,v\),\(sub(u)∩sub(v)=NULL\)

因此答案就是对于所有的状态\(st\),\(ans=\sum_{st} maxlen(st)-minlen(st)+1\)

#include<bits/stdc++.h>
#include<unordered_map>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define fastIO ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define println(x) print(x),print('\n')
using namespace std;
using ll = long long;
using pr = pair<ll,ll>;
const int MAXN = 1e6+11;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-7; struct SAM{
int tot;
int trans[MAXN<<1][26];
int slink[MAXN<<1];
int maxlen[MAXN<<1],minlen[MAXN<<1];
void init(){
tot=1;
maxlen[1]=minlen[1]=slink[1]=0;
rep(i,0,25) trans[1][i]=0;
}
int node(int mx,int mn,int old,int _slink){
++tot;
maxlen[tot]=mx;
minlen[tot]=mn;
memcpy(trans[tot],trans[old],sizeof trans[0]);
slink[tot]=_slink;
return tot;
}
int add(char ch,int u){
int c=ch-'a';
int z=node(maxlen[u]+1,0,0,0);
int v=u;
while(v&&trans[v][c]==0){
trans[v][c]=z;
v=slink[v];
}
if(v==0){
minlen[z]=1;
slink[z]=1;
return z;
}
int x=trans[v][c];//compare
if(maxlen[x]==maxlen[v]+1){
slink[z]=x;
minlen[z]=maxlen[x]+1;
return z;
}
int y=node(maxlen[v]+1,0,x,slink[x]);//chai dian
slink[y]=slink[x]; //ji cheng
slink[x]=y; //chai dian y laizi yu x
slink[z]=y; //fen pei z de suffix-path minlen[x]=maxlen[v]+2; //=maxlen[y]+1
minlen[z]=maxlen[y]+1; int w=v;
while(w&&trans[w][c]==x){
trans[w][c]=y;
w=slink[w];
} minlen[y]=maxlen[slink[y]]+1; //biran kebujilu return z;
}
}sam;
char str[MAXN];
int main(){
#ifndef ONLINE_JUDGE
freopen("stdin.txt","r",stdin);
#endif
while(~scanf("%s",str+1)){
sam.init();
int last=1;
int len=strlen(str+1);
for(int i=1;i<=len;i++){
last=sam.add(str[i],last);
}
ll ans=0;
for(int i=2;i<=sam.tot;i++){
ans+=sam.maxlen[i]-sam.minlen[i]+1;
}
printf("%lld\n",ans);
}
return 0;
}

HihoCoder - 1445 后缀自动机 试水题的更多相关文章

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

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

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

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

  3. hihocoder 1457 后缀自动机四·重复旋律7 求不同子串的和

    描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的是小Hi发现了一部名字叫<十进制进行曲大全>的作品集,顾名思义,这部作品集里有许多作品 ...

  4. HIHOcoder 1457 后缀自动机四·重复旋律7

    思路 后缀自动机题目,题目本质上是要求求出所有不同的子串的和,SAM每个节点中存放的子串互不相同,所以对于每个节点的sum,可以发现是可以递推的,每个点对子节点贡献是sum[x]*10+c*sz[x] ...

  5. [ZJOI2015]诸神眷顾的幻想乡 广义后缀自动机_DFS_语文题

    才知道题目中是只有20个叶子节点的意思QAQ.... 这次的广义后缀自动机只是将 last 设为 1, 并重新插入. 相比于正统的写法,比较浪费空间. Code: #include <cstdi ...

  6. hihocoder 1457 后缀自动机四·重复旋律7 ( 多串连接处理技巧 )

    题目链接 分析 : 这道题对于单个串的用 SAM 然后想想怎么维护就行了 但是多个串下.可以先将所有的串用一个不在字符集( 这道题的字符集是 '0' ~ '9' ) 链接起来.建立后缀自动机之后 在统 ...

  7. hihoCoder #1457 : 后缀自动机四·重复旋律7(后缀自动机 + 拓扑排序)

    http://hihocoder.com/problemset/problem/1457 val[i] 表示状态i所表示的所有字符串的十进制之和 ans= ∑ val[i]在后缀自动机上,从起始状态走 ...

  8. HIHOcoder 1466 后缀自动机六·重复旋律9

    思路 后缀数组+博弈论的好题,首先对两个串都建出SAM,然后题目的要求实际上就是在SAM的trans上转移即可 DAG的博弈是经典问题,然后dfs求出SG函数,两个游戏的组合就是把SG函数异或起来,异 ...

  9. HIHOcoder 1449 后缀自动机三·重复旋律6

    思路 显然endpos的大小就对应了对应子串的出现次数,所以快速求出endpos的大小,然后用它更新对应子串长度(minlen[i]~maxlen[i])的答案即可 endpos的大小可以拓扑排序求出 ...

随机推荐

  1. idea如何设置注释作者信息

    什么情况下使用? 在建一个新的类的时候   有注释信息  如下图所示 实现步骤 1  打开idea后   点击File后 选择Settings..如下图 2 打开后打开 file and code t ...

  2. Area Learning

    Area Learning区域学习 How it works它是如何工作的 With Motion Tracking alone, the device tracks its movement and ...

  3. VS2017中对C++的单元测试

    安装Visual Studio 2017 由于平时都是用codeblock,因此电脑中没有装VS系列的IDE,就从安装开始吧 最开始安装的时候没有注意什么都没选,安装完了以后根本没有c++的编译器和各 ...

  4. linux下文件打包、压缩详解

    Linux平台下,有如下几种常见的压缩工具: ========================================================================= 工 具 ...

  5. CDI Event解析

    CDI(Contexts And Dependency Injection)是JavaEE 6标准中一个规范,将依赖注入IOC/DI上升到容器级别, 它提供了Java EE平台上服务注入的组件管理核心 ...

  6. linux inode cheat sheet

    sector:扇区,硬盘存储的最小单位,大小为0.5KB(512字节) block:块文件存取的最小单位,1 block=8 sector,大小4KB inode:存储文件元信息.内容包括 * 文件的 ...

  7. [Erlang36]kerl轻松管理安装各种OTP版本

    kerl只有一个目标:让我们在不同的OTP版本间随意切换.他是一个纯Bash项目.简单实用的工作利器! Readme里面用法已说明得非常清楚了.建议按流程来一次. 1.下载 安装(一个bash脚本,根 ...

  8. 在 Docker 中部署 ASP.NET CORE 应用

    有了 Docker 之后, 部署起来却这间非常方便,环境不用搭了, 直接创建一个 microsoft/aspnetcore 的容器, 在本地开发好后, 把内容直接部署到容器中. 下面的命令是把本地发布 ...

  9. cnVCL的安装

    cnVCL是cnpack组件中的不可视组件库,里面包含很多有用的组件,网址:http://www.cnpack.org/showdetail.php?id=739&lang=zh-cn 安装步 ...

  10. You can't specify target table 'e' for update in FROM clause

    UPDATE emp e SET e.salary=e.salary+7 WHERE e.id IN(SELECT e1.id FROM emp e1,dept d WHERE e1.dep_id=d ...