「HDU6583 Typewriter」 - 后缀自动机
HDU6583 Typewriter
tags:后缀自动机
题意
一开始你有一个空串,你有两种操作,一是向这个串的末尾加上任意小写字母,代价为 \(p\), 二是向这个串的末尾加上这个串的任意一个子串,告诉你最终状态,让你求最少要多少代价才能变成最终状态
题解
用 \(f_i\) 表示变成 \(s[1,i]\) 的最小代价
那么对于第一种操作 \(f_i=f_{i-1}+p\)
对于第二种操作 \(f_i=f_{j-1}+q\), 其中, \(s[j,i]\) 在 \(s[1,j-1]\) 种出现过
第一种很好转移,第二种用后缀自动机维护,由于 \(j\) 是单调的,所以在 \(j\) 向右移时将 \(s_j\) 加入 SAM, 然后维护 \(s[l,r]\) 的节点即可,时间复杂度是 \(O(n)\) 的
#include<cstdio>
#include<cstring>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
template<typename T>inline void rd(T&x){int fl=0,ch;while(ch=getchar(),ch<48||57<ch)fl^=!(ch^45);x=(ch&15);while(ch=getchar(),47<ch&&ch<58)x=x*10+(ch&15);if(fl)x=-x;}
template<typename T>inline void pt(T x){if(x<0)putchar('-'),x=-x;if(x>9)pt(x/10);putchar(x%10+48);}
template<typename T>inline void pt(T x,int ch){pt(x),putchar(ch);}
template<typename T>inline T max(const T&x,const T&y){return x<y?y:x;}
template<typename T>inline T min(const T&x,const T&y){return x<y?x:y;}
typedef long long ll;
const int N=200005;
int n,w1,w2,f[N];char s[N];ll ans;
struct SAM{int cnt,lst,fa[N<<1],ch[N<<1][26],len[N<<1];SAM(){cnt=lst=1;}void clear(){for(int i=1;i<=cnt;++i)fa[i]=len[i]=0,memset(ch[i],0,sizeof(ch[i]));cnt=lst=1;}void extend(int c){int p=lst,np=lst=++cnt;len[np]=len[p]+1;for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;if(!p)fa[np]=1;else{int q=ch[p][c];if(len[p]+1==len[q])fa[np]=q;else{int nq=++cnt;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[nq]));fa[nq]=fa[q],fa[q]=fa[np]=nq;for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;}}}
}sam;
signed main(){while(scanf("%s",s+1)!=EOF){rd(w1),rd(w2);n=strlen(s+1);sam.clear();int p=1,l=1;for(int r=1;r<=n;++r){f[r]=f[r-1]+w1;int c=s[r]-'a';while((!sam.ch[p][c]||r-l+1>l-1)&&l<=r){sam.extend(s[l++]-'a');while(p&&sam.len[sam.fa[p]]>=r-l)p=sam.fa[p];if(!p)p=1;}p=sam.ch[p][c];while(p&&sam.len[sam.fa[p]]>=r-l+1)p=sam.fa[p];if(!p)p=1;if(l<=r){f[r]=min(f[r],f[l-1]+w2);}}pt(f[n],'\n');}return 0;
}
转载于:https://www.cnblogs.com/xay5421/p/HDU6583.html
「HDU6583 Typewriter」 - 后缀自动机相关推荐
- 10年读4个博士学位的“神之子”创办「莆田系」AI顶会,骗欧美学术精英,收报名费3688元...
文末留言区送 6 本机械工业出版社赞助书籍 贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 机器人领域顶会ICRA 2021,将于明年7月19-21日在奥地利维也纳举办,报名注册费用45 ...
- 全文解析:面向基于区块链的「机器人经济学」概念中,如何验证自主智能体的行为?...
原文来源:arXiv 作者:Konstantin Danilov.Ruslan Rezin.Alexander Kolotov. Ilya Afanasyev 「雷克世界」编译:嗯~是阿童木呀.KAB ...
- 「AHOI / HNOI2018」转盘 解题报告
「AHOI / HNOI2018」转盘 可能是我语文水平不太行... 首先可以猜到一些事实,这个策略一定可以被一个式子表示出来,不然带修修改个锤子. 然后我们发现,可以枚举起点,然后直接往前走,如果要 ...
- 职称计算机考试选择题,职称计算机考试综合选择题「附答案」.docx
职称计算机考试综合选择题「附答案」 一.选择题 .PoWerPoint 中,插入凶片操作中,描入的图片必须满足一定的格式,下列选项中,不属于于图片格式的后缀是 (D) . .选出关于 PowerPoi ...
- 何以为「我来」?全方位解读笔记新秀高速增长
谈到国内的云端笔记协作平台,不得不提到国内的新秀产品--「我来」,自去年 9 月份上线至今,「我来」用户已超过 20 万,每月正以 200%-300% 的速度持续增长中,活跃用户日均使用时长超过 30 ...
- php psr-2,「PSR 规范」PSR-2 编码风格规范
编码风格指南 本篇规范是 PSR-1 基本代码规范的继承与扩展. 本规范希望通过制定一系列规范化PHP代码的规则,以减少在浏览不同作者的代码时,因代码风格的不同而造成不便. 当多名程序员在多个项目中合 ...
- 自考计算机网络技术一,2017自考计算机网络技术填空题「附答案」
2017自考计算机网络技术填空题「附答案」 一.填空题 1.物理层的功能是实现原始数据在_______上的传输,它是数据通信的基础功能,实际的比特传输,是指在_______之上为上一个传输原始比特流的 ...
- 「小算法」回文数与数值合法性检验
喵喵喵,小夕最近准备复习一下数学和基础算法,尽量每篇推送下面会附带点数学和基础算法的小文章.说不定哪天就用(考)到了呢( ̄∇ ̄)注意哦,与头条位的文章推送不同,「小公式」和「小算法」里的小标题之间可能 ...
- await原理 js_「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能
本周,Nodejs v14.3.0 发布.这个版本包括添加顶级 Await.REPL 增强等功能. REPL 增强 通过自动补全改进对 REPL 的预览支持,例如,下图中当输入 process.ver ...
- macos 全局代理 app_「主观向」macOS 好软推荐(使用体验)
Hi All,我是@旅客君,经过了两个月左右使用 MacBook 的体验,我认为 macOS 的确为我们提供了一个非常好的工作(效率)平台,而在 macOS 上优质的应用也有不少,接下来在这篇文章当中 ...
最新文章
- 将大核卷积分三步,清华胡事民、南开程明明团队全新视觉骨干VAN,超越SOTA ViT和CNN...
- Flutter开发之SimpleDialog对话框组件-1(40)
- 微信小程序————经纬度转化为具体位置(逆地址解析)
- SpringBoot + MyBatis(注解版),常用的SQL方法
- 做了项目才知道的Cookie和Session
- SLAM 无人车融合 IMU 前与 融合 IMU 后的实测效果演示
- 少儿编程python学啥-少儿编程学什么?少儿编程课程体系介绍
- 3U VPX板卡设计
- Hadoop数据开发笔试题(一)
- 计算机键盘灯光怎么关闭,电脑关机键盘灯一直亮着解决方法
- 2021-10-08
- c语言oj质数还是合数,求数据帝帮忙测试一下代码,已被南洋理工大学的oj搞蒙.....
- 克隆硬盘后进不去系统_克隆硬盘后进不去系统_如何将硬盘克隆到较小的固态硬盘?...
- 百度地图 - 周边检索
- 460.LFU 缓存
- 【OpenCV在图片上绘制点、圆(C++)】
- 深度linux64位系统下载,深度操作系统下载 deepin深度操作系统 15.10 正式版 64/32位 下载-脚本之家...
- 【python 图片文字识别】pyocr图片文字识别
- 【Java UI】HarmonyOs如何集成Hawk
- 数据仓库—stg层_数据仓库(一):认识数据仓库