[SDOI2016]生成魔咒(后缀自动机)
2024-10-20 21:05:30
看一眼题。本质不同的字串数。
嘴角微微上扬。
每一次加一个数输出一个答案。
笑容渐渐消失。
等等,\(SAM\)好像也可以求本质不同的字串。
设当前字符串用\(x\)表示,每次插入完成后\(ans\)加上\(len[x]-len[fa]\)就行了。
嘴角微微上扬。
等等,炸空间了。
笑容渐渐消失。
用\(map\)不就得了。
嘴角再次上扬。
写完过了。
笑出了声。
翻题解,时看到了\(SA\)。
笑容渐渐僵硬。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
#define int long long
const int N=101000;
int n,ans;
struct SAM{
int tot,u,len[N*2],fa[N*2];
map<int,int>trans[N*2];
void init(){tot=u=1;}
void ins(int c){
int x=++tot;len[x]=len[u]+1;
for(;u&&trans[u][c]==0;u=fa[u])trans[u][c]=x;
if(u==0)fa[x]=1,ans+=len[x];
else{
int v=trans[u][c];
if(len[u]+1==len[v])fa[x]=v,ans+=len[x]-len[v];
else{
int w=++tot;len[w]=len[u]+1;
trans[w]=trans[v];
fa[w]=fa[v];
fa[x]=fa[v]=w;
ans+=len[x]-len[w];
for(;u&&trans[u][c]==v;u=fa[u])trans[u][c]=w;
}
}
u=x;
}
}sam;
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
signed main(){
n=read();
sam.init();
for(int i=1;i<=n;i++){
sam.ins(read());
printf("%lld\n",ans);
}
return 0;
}
最新文章
- 2015.10.15class
- typedef 与define 的区别
- C# 把引用的dll嵌入到exe文件中
- Dozer应用——类之间值的映射
- 从 Auto Layout 的布局算法谈性能
- 28个MongoDB NoSQL数据库的面试问答
- Java集合类操作优化总结
- require 书写约定
- YKCW6-BPFPF-BT8C9-7DCTH-QXGWCYQ7PR-QTHDM-HCBCV-9GKGG-TB2TM
- oracle to_char()及to_date()函数使用
- c++代码的陪伴下----菜鸟的转变
- 深入浅出数据结构C语言版(20)——快速排序
- PHP判断是手机端还是PC端
- <;训练赛>; 垃圾陷阱
- python中的多线程和多进程编程
- Spring Cloud Feign 使用方法与性能优化
- 对象属性的描述:writable、enumerable、configurable
- BugFree设置邮箱通知(这里以163邮箱为例)
- 分布式系统CAP理论与CA选择
- VS的IISExpress配置通过IP访问程序
热门文章
- BA-WG-冷源
- CSTC 选课
- C# SortedDictionary&;lt;TKey, TValue&;gt; 类
- 区间最小值 线段树 (2015年 JXNU_ACS 算法组暑假第一次周赛)
- org.openqa.selenium.NoSuchElementException:
- Chrome Extension 的 webRequest模块的解读
- 《编程导论(Java)&;#183;1.4.1 范式》
- [think in java]第12章 通过异常处理错误
- CSU 1506 Problem D: Double Shortest Paths(最小费用最大流)
- 让ubuntu支持GBK编码AAAAA