2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信
题目传送门
sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移到$dp[i]$。
- AC自动机
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int MAXN = ;
const LL INF = 0x3f3f3f3f3f3f3f3f;
struct Trie {
int son[MAXN][], fail[MAXN], last[MAXN], dep[MAXN];
LL val[MAXN], dp[MAXN]; int tot, root;
int add_node(int d) {
memset(son[tot], -, sizeof(son[tot]));
dep[tot] = d; val[tot] = INF;
return tot ++;
}
void init() {
memset(dp, INF, sizeof(dp));
dp[] = tot = ;
root = add_node();
}
void insert(char* s, LL v) {
int p = root;
for (int i = ; s[i]; i++) {
int index = s[i] - 'a';
if (son[p][index] == -)
son[p][index] = add_node(i + );
p = son[p][index];
}
val[p] = min(val[p], v);
}
void build() {
queue<int> que; fail[root] = root;
for (int i = ; i < ; i++) {
if (son[root][i] == -) son[root][i] = root;
else {
fail[son[root][i]] = root;
last[son[root][i]] = root;
que.push(son[root][i]);
}
}
while (!que.empty()) {
int p = que.front(); que.pop();
for (int i = ; i < ; i++) {
if (son[p][i] == -) son[p][i] = son[fail[p]][i];
else {
fail[son[p][i]] = son[fail[p]][i];
if (val[son[fail[p]][i]] != INF)
last[son[p][i]] = son[fail[p]][i];
else
last[son[p][i]] = son[last[p]][i];
que.push(son[p][i]);
}
}
}
}
LL slove(char* s) {
int p = root, len = strlen(s);
for (int i = ; i < len; i++) {
int index = s[i] - 'a';
p = son[p][index];
for (int tmp = p; tmp != root; tmp = last[tmp])
dp[i + ] = min(dp[i + ], dp[i + - dep[tmp]] + val[tmp]);
}
if (dp[len] == INF) return -;
else return dp[len];
}
} ac;
char s[MAXN];
int main() {
int n, v;
scanf("%d", &n); ac.init();
for (int i = ; i <= n; i++) {
scanf("%s%d", s, &v);
ac.insert(s, v);
}
ac.build();
scanf("%s", s);
printf("%lld\n", ac.slove(s));
return ;
}AC自动机不熟练,硬怼了三天才敲出来,一直超时。又学到了两个AC自动机的优化。
 
2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信的更多相关文章
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
		
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
 - 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)
		
题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...
 - 2020 CCPC Wannafly Winter Camp Day1 Div.1& F
		
#include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...
 - 2020 CCPC Wannafly Winter Camp Day1-F-乘法
		
题目传送门 sol:二分答案$K$,算大于$K$的乘积有多少个.关键在于怎么算这个个数,官方题解上给出的复杂度是$O(nlogn)$,那么计算个数的复杂度是$O(n)$的.感觉写着有点困难,自己写了一 ...
 - K	破忒头的匿名信(ac自动机+小dp)
		
题:https://ac.nowcoder.com/acm/contest/4010/K 题意:用一些模式串凑成一个目标串,每个模式串有消耗,问组合的最小消耗,或不能组成输出-1: 分析:典型的AC自 ...
 - CCPC Wannafly Winter Camp Div2 部分题解
		
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
 - Wannafly Camp 2020 Day 2K 破忒头的匿名信 - AC自动机,dp
		
给定字典和文章,每个单词有价值,求写文章的最小价值 标准的 AC 自动机 dp,设 \(f[i]\) 表示写 \(s[1..i]\) 的最小价值,建立AC自动机后根据 trans 边暴力转移即可 建了 ...
 - 2020 CCPC-Wannafly Winter Camp Day2
		
2020 CCPC-Wannafly Winter Camp Day2 A 托米的字符串 虽然每个子串出现的概率是相同的,但是同一长度的子串个数是不同的,所以要分别处理.计算出某一长度的情况下,元音字 ...
 - 2019 wannafly winter camp
		
2019 wannafly winter camp Name Rank Solved A B C D E F G H I J K day1 9 5/11 O O O O O day2 5 3/11 O ...
 
随机推荐
- 从单个系统到云翼一体化支撑,京东云DevOps推进中的一波三折
			
作者:王利莹 采访嘉宾:京东云DevOps团队负责人 郑永宽 今年,IDC 特别针对中国地区发布了<IDC MarketScape:中国 DevOps 云市场2019,厂商评估>研究报告, ...
 - 201809-2  买菜 Java
			
思路: 顺序读入,例如:小H装车的时间段为[1,3],小W装车的时间段为[2,4],重叠部分为[2,3],记在数组times[2]中.最后输出时判断数组times中值大于1的(其实就是2),即为重叠部 ...
 - cf1200 D White Lines(二维差分)
			
题目大意 有一个大小为n的矩阵,每个1*1的单位为黑或白,我们可以用一个(只有一个)大小为k*k的白色矩阵覆盖,问:最多的时候有几条白线(横的全为白 或竖的全为白 即为白线). 思路 要想把一条线(以 ...
 - XML--XML Schema Definition(一)
			
参考 https://blog.csdn.net/wangw2008/article/details/83195283 https://blog.csdn.net/lmj623565791/artic ...
 - 读书笔记 - js高级程序设计 - 第七章 函数表达式
			
闭包 有权访问另一个函数作用域中的变量的函数 匿名函数 函数没有名字 少用闭包 由于闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存.过度使用闭包可能会导致内存占用过多,我们建议读者 ...
 - CountUp.js 数字跳转效果小插件
			
CountUp.js 实现数字跳转效果的小插件 //调用方法 const easingFn = function (t, b, c, d) { var ts = (t /= d) * t; var ...
 - Ubuntu系统下QEMU环境搭建
			
(这篇文章是在搭建QEMU环境时,在网上找到了一些教程资料,并在实际操作中遇到的一些问题的整理) 下载Linux内核 下载内核有两种方法,一种是用git直接下载内核代码树,方便后面的内核开发.另一种是 ...
 - k8认证机制
			
参考下面博文 http://www.mamicode.com/info-detail-2270627.html 需要补充: k8s的的认证机制场景使用 客户端证书认证 采用双向证书进行 ...
 - Mac Outlook 2016 无法打开会议室日历
			
问题:Mac Outlook 2016 无法打开会议室日历信息,报错截图如下: 解决方案: Set-MailboxFolderPermission -Identity XXX@xxx.com:\日历 ...
 - js filter()用法小结
			
/* filter() 对数组中的每个元素都执行一次指定的函数(callback),并且创建一个新的数组, 该数组元素是所有回调函数执行时返回值为 true 的原数组元素.它只对数组中的 非空元素执行 ...