K 破忒头的匿名信(ac自动机+小dp)
题:https://ac.nowcoder.com/acm/contest/4010/K
题意:用一些模式串凑成一个目标串,每个模式串有消耗,问组合的最小消耗,或不能组成输出-1;
分析:典型的AC自动机处理后在跳fail的过程中进行操作,这里操作就是dp计算最小。用dp[i]表示长串前ii位的最小代价,若有一个单词s是长串的前ii项的后缀,那么可以用dp[i−len(s)]+val(s)转移到dp[i]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=1e18;
const int M=5e5+;
int trie[M][],fail[M],cnt;
ll val[M],dp[M],deep[M];
void insert(string s,ll v){
int root=,len=s.size();
for(int i=;i<len;i++){
if(!trie[root][s[i]-'a'])
trie[root][s[i]-'a']=++cnt;
root=trie[root][s[i]-'a'];
}
val[root]=min(val[root],v);
deep[root]=len;
}
void getfail(){
queue<int>que;
while(!que.empty())
que.pop();
for(int i=;i<;i++)
if(trie[][i]){
fail[trie[][i]]=;
que.push(trie[][i]);
}
while(!que.empty()){
int now=que.front();
que.pop();
for(int i=;i<;i++){
if(trie[now][i]){
fail[trie[now][i]]=trie[fail[now]][i];
que.push(trie[now][i]);
}
else
trie[now][i]=trie[fail[now]][i];
}
}
}
ll query(string s){
int now=,len=s.size();
for(int i=;i<len;i++){
now=trie[now][s[i]-'a'];
for(int j=now;j;j=fail[j]){
if(deep[j])
dp[i+]=min(dp[i+],dp[i+-deep[j]]+val[j]);
}
}
if(dp[len]>=INF)
return -;
return dp[len];
}
void init(){
for(int i=;i<M;i++)
dp[i]=val[i]=INF;
dp[]=val[]=;
}
int main(){
ios::sync_with_stdio(false);
cin.tie();
init();
int n;
string s;
cin>>n;
for(int i=;i<=n;i++){
ll v;
cin>>s>>v;
insert(s,v);
}
fail[]=;
getfail();
cin>>s;
cout<<query(s);
return ;
}
K 破忒头的匿名信(ac自动机+小dp)的更多相关文章
- Wannafly Camp 2020 Day 2K 破忒头的匿名信 - AC自动机,dp
给定字典和文章,每个单词有价值,求写文章的最小价值 标准的 AC 自动机 dp,设 \(f[i]\) 表示写 \(s[1..i]\) 的最小价值,建立AC自动机后根据 trans 边暴力转移即可 建了 ...
- UVa 11468 (AC自动机 概率DP) Substring
将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. #include <cs ...
- 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 682 Solved: 364 Description 我们称一 ...
- 关于AC自动机和DP的联系
首先是描述个大概.不说一些特殊的DP 或者借用矩阵来状态转移 (这些本质都是一样的). 只讲AC自动机和DP的关系(个人理解). AC自动机 又可以叫做状态机. 我一开始的认为.AC 自动机提供了一些 ...
- 【bzoj3530】[Sdoi2014]数数 AC自动机+数位dp
题目描述 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运 ...
- BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)
题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况, ...
- 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信
题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...
- 【POJ2778】DNA Sequence(AC自动机,DP)
题意: 生物课上我们学到,DNA序列中只有A, C, T和G四种片段. 经科学发现,DNA序列中,包含某些片段会产生不好的基因,如片段"ATC"是不好片段,则"AGATC ...
- HDU3247 Resource Archiver(AC自动机+BFS+DP)
题目,求最短的包含所有n个DNA片段且不包含任何一个病毒片段的序列. 容易用所有DNA片段和病毒片段建一个AC自动机,构造fail时处理一下各个结点后缀是DNA或者病毒的情况,然后dp[S][u]表示 ...
随机推荐
- 19 01 18 dango 模型
定义属性 Django根据属性的类型确定以下信息: 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认html控件 在管理站点最低限度的验证 django会为表创建自动增长的主键列,每个模型只能 ...
- JAVAEE 和项目开发(第六课:服务器的安装和目录介绍和闪退解决办法)
课程介绍: 在学习了 HTTP 协议后,我们对浏览器和服务器的交互流程以及规范有了一定程度的认知,并也有了自己的理解.但是不少同学对服务器的概念还是有些模糊的,那么本节课就针对服务器进行介绍,我们一起 ...
- linux搭建mariadb,windows2008搭建iis+php+wordpress
centos ip:192.168.101 windows ip :192.168.102 centos配置: [root@ml ~]# yum -y install mariadb-server # ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 存储类
存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前.下面列出 C++ 程序中可用的存储类: auto register static extern m ...
- vue实现CheckBox与数组对象绑定
实现需求: 实现一个简易的购物车,页面的表格展示data数据中的一个数组对象,并提供选中商品和全选商品checkbox复选框,页面实时显示选中商品的总金额: 分析: 1:使用v-for循环渲染arra ...
- 备份 分区表 mbr
备份方法: 1.备份分区表信息 sudo fdisk -l >hda.txt #分区表信息重定向输出到文件中 2.备份MBR linux@linux-desktop:~/ex$ sudo ...
- google docker镜像下载
https://anjia0532.github.io/2017/11/15/gcr-io-image-mirror/
- JavaScript 之 异步请求
一. 1.异步(async) 异步,它的孪生兄弟--同步(Synchronous),"同步模式"就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排 ...
- 【每日Scrum】第三天冲刺
一.计划会议内容 登录和个人主界面开发布局实现. 二.任务看板 三.scrum讨论照片 四.产品的状态 登录与个人界面布局实现 五.任务燃尽图
- one_day_one_linuxCmd---netstat命令
<坚持每天学习一个 linux 命令,今天我们来学习 netstat 命令> 前言:netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态等,还可以很方便查看本地机器上 ...