博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
阅读量:6369 次
发布时间:2019-06-23

本文共 1251 字,大约阅读时间需要 4 分钟。

题意:询问一个字符串每个前缀有多少不同的子串


做了一下SDOI2016R1D2,题好水啊随便AK

强行开map上SAM

每个状态的贡献就是\(Max(s)-Min(s)+1\)
插入的时候维护一下就行了

#include 
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;#define fir first#define sec secondconst int N=3e5+5, P=1e9+7;inline int read() { char c=getchar(); int x=0, f=1; while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();} while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();} return x*f;}int n, s[N]; ll ans;struct meow { map
ch; int par, val;}t[N];int sz=1, root=1, last=1;void extend(int c) { int p=last, np=++sz; t[np].val = t[p].val+1; for(; p && !t[p].ch[c]; p=t[p].par) t[p].ch[c]=np; if(!p) t[np].par = root; else { int q=t[p].ch[c]; if(t[q].val == t[p].val+1) t[np].par=q; else { ans -= t[q].val - t[p].val; int nq=++sz; t[nq]=t[q]; t[nq].val = t[p].val+1; t[q].par = t[np].par = nq; ans += t[q].val - t[nq].val; ans ++; for(; p && t[p].ch[c]==q; p=t[p].par) t[p].ch[c] = nq; } } ans+=t[np].val - t[t[np].par].val; last=np;}int main() { //freopen("in","r",stdin); freopen("incantation.in","r",stdin); freopen("incantation.out","w",stdout); n=read(); for(int i=1; i<=n; i++) { s[i]=read(); extend(s[i]); printf("%lld\n",ans); }}

转载地址:http://wxema.baihongyu.com/

你可能感兴趣的文章
忘记root用户密码怎么办?
查看>>
esxi定时任务
查看>>
Scaffold-DbContext
查看>>
关于VMware Workstation主机列表问题求教
查看>>
配置管理小报101021:给ubuntu加监控
查看>>
qml文字滚动效果的封装,实现方式运用的qml中提供的动画效果,另一种实现方式也可以使用定时器修改控件的坐标来实现...
查看>>
标准C++实现任务队列
查看>>
jdbc url
查看>>
刷leetcode第704题-二分查找
查看>>
debug_backtrace() 函数生成一个 backtrace(追踪)
查看>>
第七天,还是盒子
查看>>
XAMPP软件包下载
查看>>
XXL-JOB初体验-ORACLE版
查看>>
沉思录:别人的棺材
查看>>
jersey + spring + mybatis + redis项目搭建
查看>>
PAT 1006 部分正确_另一种解法
查看>>
在Keil环境下使用JLink实现printf输出重定向至debug窗口
查看>>
postgres的\d命令不显示全部的用户表
查看>>
poj 3468 A Simple Problem with Integers
查看>>
OOA/OOD/OOP细讲
查看>>