BZOJ4629: [BeiJing2016]打字机

【省选题简易题解合集】 SDOI 2016探险路线题目所给的限制的路径实际上形状是固定的,根据形状分成三个子问题(在墙角迂回、跳跃、跨过全场洄游)进行DP,再将它们合并起来,就可以做这个题了。齿轮简单地用取模或者分解质因数来计算就可以知道是否合法了。平凡的骰子十分基础的立体几何转平面几何。转换一下坐标系随便算算投影就可以了。硬币游戏经典SG游戏,论文里面提到的经典做法,但是需要依靠一个结论就是这种硬币游戏基本都是全局的SG 阅读详情

题目大意:给定n个单词,每个单词有一个分数,每次你可以打任意一个a~z的字符,每当纸带上出现一次某个单词,得分就加上这个分数,但是有时会打出不想打的字符,但这种情况最多发生k次,问最坏情况下他最多能得多少分

HINT:

原题面数据范围

测试点 1 – 2 满足,n = 1 或 k = 0;

测试点 1 – 6 满足,n ≤ 100,m ≤ 500,∑|Si| ≤ 500,A i ≤1000;

测试点 7 – 8 满足,k = 0,∑|Si| ≤ 200;

测试点 9 – 10 满足,∑|Si| ≤ 50,A i ≤1。

对于 100%的数据,n ≤ 100,m ≤ 10 9
,∑|Si| ≤ 500,A i ≤1000,k ≤ 5。

首先我们捋一下题意:

最坏情况下,那一定是恰好发生k次打错字符的事情,而对于每个时刻的26种方案中,一定有一个最优情况,这个情况就是这个时刻想打出的字符,也就是说对于任何时刻,下一步的最优字符一定是已经确定的

所以我们可以先建立AC自动机,每个单词的终止节点拥有一个分数,然后考虑在上面做一些事情

对于1-6我们可以DP,设F[i][j][k]表示当前在i号节点,文章长度剩余j,最多还能犯k次错误的最大得分

那么怎么递推呢,假设他这次没犯错误,那么一定会选26种情况里获利最大的那个f[p][j-1][k]  (p是最优情况)

但是他还有可能犯错,所以要和另外25种情况取个min f[p][j-1][k-1] (p不是最优情况)

这样我们可以得到60分

 

对于7-8,特殊点在于k=0,这样的话就不会有犯错的情况出现了想打什么就打什么,这样我们就可以用类似矩阵乘法快速幂的东西快速求解

对于9-10,有很多种做法,官方给的是利用ai<=1这点来找出最优比例环,然后一直在环上走这样的

然后xuruifan写了一个大概是大块矩阵乘法小块暴力DP的做法,也是能A的

只有我非常虎的写了个大块贪心小块DP,正确度无法保证(前面两个是有保证的),然后+1就过了

 

#include<iostream> 
#include<cstdio> 
#include<cstring> 
#define N 510 
using namespace std; 
char s[N]; 
int a[110]; 
int ch[N][27],nxt[N],la[N],w[N],cnt; 
void addnew(int v) 
{ 
    int now=0; 
    int n=strlen(s),i,j,x; 
    for(i=0;i<n;i++) 
    { 
        x=s[i]-96; 
        if(!ch[now][x]) 
        { 
            cnt++; 
            ch[now][x]=cnt; 
        } 
        now=ch[now][x]; 
    } 
    w[now]+=v; 
} 
int q[N],h,t; 
void getnxt() 
{ 
    h=1;t=0; 
    int i,j,x,y; 
    for(i=1;i<=26;i++) 
    if(ch[0][i]) t++,q[t]=ch[0][i]; 
    while(h<=t) 
    { 
        x=q[h];h++; 
        for(i=1;i<=26;i++) 
        { 
            j=ch[x][i]; 
            if(!j) {ch[x][i]=ch[nxt[x]][i];continue;} 
            y=nxt[x]; 
            while(y&&!ch[y][i]) y=nxt[y]; 
            nxt[j]=ch[y][i]; 
            w[j]+=w[nxt[j]]; 
            if(w[nxt[j]]) la[j]=nxt[j]; 
            else la[j]=la[nxt[j]]; 
            t++;q[t]=j; 
        } 
    } 
} 
int f[N][N][6]; 
bool used[N][N][6]; 
int K,m; 
void dp(int n,int x,int k) 
{ 
    if(k>K||used[n][x][k]) return; 
    used[n][x][k]=true; 
    f[n][x][k]=w[x]; 
    if(n==m) return; 
    int maxn=-707185547707185547LL,maxb=0; 
    int i,j; 
    for(i=1;i<=26;i++) 
    { 
        dp(n+1,ch[x][i],k); 
        if(k<K) 
        dp(n+1,ch[x][i],k+1); 
        if(f[n+1][ch[x][i]][k]>maxn) 
        { 
            maxn=f[n+1][ch[x][i]][k]; 
            maxb=i; 
        } 
    } 
    maxn=707185547707185547LL; 
    for(i=1;i<=26;i++) 
    { 
        if(i==maxb) maxn=min(maxn,f[n+1][ch[x][i]][k]); 
        else if(k<K) maxn=min(maxn,f[n+1][ch[x][i]][k+1]); 
    } 
    f[n][x][k]+=maxn; 
} 
long long di[210][210],ret[210][210],tmp[210][210]; 
long long ans; 
void do1(int M,bool chu) 
{ 
    ans=0; 
    int i,j,k; 
    if(chu) 
    { 
        memset(di,0xef,sizeof(di)); 
        for(i=0;i<=cnt;i++) 
        for(j=1;j<=26;j++) 
        di[i][ch[i][j]]=w[ch[i][j]]; 
        for(i=0;i<=cnt;i++) 
        for(j=0;j<=cnt;j++) 
        ret[i][j]=di[i][j]; 
        M--;     
        while(M) 
        { 
            for(i=0;i<=cnt;i++) 
            for(j=0;j<=cnt;j++) 
            tmp[i][j]=-707185547707185547LL; 
            if(M&1) 
            { 
                for(i=0;i<=cnt;i++) 
                for(k=0;k<=cnt;k++) 
                for(j=0;j<=cnt;j++) 
                tmp[i][j]=max(ret[i][k]+di[k][j],tmp[i][j]); 
                for(i=0;i<=cnt;i++) 
                for(j=0;j<=cnt;j++) 
                ret[i][j]=tmp[i][j]; 
            } 
            for(i=0;i<=cnt;i++) 
            for(j=0;j<=cnt;j++) 
            tmp[i][j]=-707185547707185547LL; 
            for(i=0;i<=cnt;i++) 
            for(k=0;k<=cnt;k++) 
            for(j=0;j<=cnt;j++) 
            tmp[i][j]=max(tmp[i][j],di[i][k]+di[k][j]); 
            for(i=0;i<=cnt;i++) 
            for(j=0;j<=cnt;j++) 
            di[i][j]=tmp[i][j]; 
            M/=2; 
        } 
        memset(di,0xef,sizeof(di)); 
        for(i=0;i<=cnt;i++) 
        for(j=1;j<=26;j++) 
        di[i][ch[i][j]]=w[ch[i][j]]; 
    } 
    else
    { 
        for(i=0;i<=cnt;i++) 
        for(j=0;j<=cnt;j++) 
        { 
            tmp[i][j]=-707185547707185547LL; 
            for(k=0;k<=cnt;k++) 
            tmp[i][j]=max(ret[i][k]+di[k][j],tmp[i][j]); 
        } 
        for(i=0;i<=cnt;i++) 
        for(j=0;j<=cnt;j++) 
        ret[i][j]=tmp[i][j]; 
    } 
    for(i=0;i<=cnt;i++) 
    ans=max(ans,ret[0][i]); 
} 
void do2() 
{ 
    int M=m; 
    int P=M-300,i,j,k; 
    long long ret=0; 
    int st; 
    for(;P<=M-250;P++) 
    { 
        for(i=0;i<=300;i++) 
        for(j=0;j<=cnt;j++) 
        for(k=0;k<=K;k++) 
        used[i][j][k]=false; 
        m=M-P; 
        dp(0,0,0); 
        do1(P,(P==M-300)); 
        ret=max(ret,f[0][0][0]+ans); 
    } 
    printf("%lld",ret+1); 
} 
int main() 
{  
    int n; 
    scanf("%d%d%d",&n,&m,&K); 
    int i,j; 
    for(i=1;i<=n;i++) 
    { 
        scanf("%s%d",s,&a[i]); 
        addnew(a[i]); 
    } 
    getnxt(); 
    if(m>500&&K==0&&cnt<=200) {do1(m,true);printf("%lld",ans);return 0;} 
    if(m>500&&K!=0&&cnt<=51) {do2();return 0;} 
    dp(0,0,0); 
    printf("%d",f[0][0][0]);
}


 

NOI2011 阿狸的打字机(BZOJ2434) 题解 Link 原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2434       Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机。打字机上只有28个按键,分别印有26个小写英文字母和'B'、'P'两个字母。 经阿狸研究发现,这个打字机是这样工作的: 输入小写字母,打字机的一个凹槽中会 阅读详情

相关推荐

软件工程导论考试通关秘籍:太原理工大学历年真题解析(附答案)

本文为太原理工大学《软件工程导论》考试提供高效备考指南,通过解析近六年真题,揭示高频考点如软件生命周期、UML建模和结构化设计等核心模块的命题规律。文章提供真题拆解、实战策略和避坑指南,帮助考生掌握图形转换题和简答题的应答技巧,助力考试通关。

weixin_29233333的博客 227

【HAOI2016】地图

时间限制 : 1000 MS 空间限制 : 265536 KB 问题描述 一天rin来到了一个遥远的都市。这个都市有n个建筑,编号从1到n,其中市中心编号为1,这个都市有m条双向通行的街道,每条街道连接着两个建筑,其中某些街道首尾相连连接成了一个环。rin通过长时间的走访,已经清楚了这个都市的两个特点: 1. 从市中心出发可以到达所有的建筑物。 2. 任意一...

StrideTG的博客 536

Unity3D赛车游戏+脚本基础

本章主要介绍Unity的基础开发流程以及涉及到的概念。这个过程需要我们学会编写一些游戏脚本,在这讲的过程中我们会完成一个赛车小游戏,因此,在讲述这些基本概念和流程的时候,会同时涉及到一点脚本的开发基础.在游戏,电影和动画中,都有一个渲染的帧率,电影是24帧/s,游戏大概是30帧/s(当然也有60帧/s的)。在unity里面1秒钟,Update方法执行了30次。1秒钟有30帧,帧与帧之所消耗的时间是不一样的,那么我如何知道上一帧用了多少时间?Time.deltaTime就是为了解决这个问题。

m0_58367586的博客 7660

bjoi2016题解<不断更新<毕竟自己弱嘛TAT>>

先看D1T3,就是LJQ送给我们的回转寿司那道题。 首先是连续段,我们直接转前缀和。 即询问:R>=Sr−Sl>=LR>= S_r - S_l >= L的有几个。 我们可以枚举右端点,并询问有多少个。 现在我们询问已知SrS_r,求前面有多少个SlS_l使得R>=Sr−Sl>=LR>= S_r - S_l >= L成立。 显而易见的是,我们可以两端减去SrS_r,即R−Sr>=Sl>=L−

Lyra's DDF 1095

prokka-原核及病毒基因组高效便捷注释

文章目录简介安装使用参考 简介 Prokka: rapid prokaryotic genome annotation 全基因组注释是在一组基因组DNA序列中识别感兴趣的特征,并用有用的信息标记它们的过程。Prokka是一款软件工具,可以快速注释细菌、古生菌和病毒基因组,并生成符合标准的输出文件。 安装 conda install -c conda-forge -c bioconda -c defaults prokka Test Type prokka and it should output its

Neptuneyut的博客 3312

YOLO26 无损剪枝:稀疏训练 + 结构化通道裁剪

YOLO26 无损剪枝链路:YOLO26s (7.2M) → 稀疏训练 30 epoch (L1 on BN gamma, lam=0.01) → 阈值剪枝 50% (gamma<quantile(0.5)) → 结构化重建 Conv+BN → 微调 10 epoch (lr=1e-4) → YOLO26n (1.9M, mAP50 0.808, 仅降 0.6%)。核心贡献:稀疏训练让 BN gamma 趋向二元分布 (近 0 或近 1), 剪枝阈值可直接取 median 自动 50% 压缩。

m0_64661770的博客 263

FJWC2016 day1 t1

我写这种水题的解题报告估计要让神犇给D飞了....... 这题的题意大概是:给定一棵树,节点是10^5级别的,每个节点有权,2个操作,一个是修改某个节点的权值,另一个是询问X到Y路径上的点权中是否可以选出3个使之构成三角形的3边。权值在0——2^31-1. 这题首先想到树剖,但是发现无法维护。 我们先来看看这样一个问题:在1到N之间选3个数使之构成三角形的三边,问最少选多少个数可以保证?记三

lpf_as_a_oier的博客 616

AUTOSAR 3万字面试题全面解析(持续更新)

ECU抽象层(EAL)是AUTOSAR架构中的一部分,它位于微控制器抽象层(MCAL)之下,但通常与MCAL一起被提及。EAL的目标是提供一个统一的接口来访问和管理ECU(Electronic Control Unit,电子控制单元)的硬件资源,包括处理器、存储器和外围设备。通过这种抽象,EAL使得上层软件能够以一种标准化的方式与ECU硬件交互,而不需要关心具体的硬件实现细节。EAL解决了硬件异构性带来的问题,即不同ECU可能采用不同类型的处理器和硬件配置。

大模型大数据攻城狮的专栏 5613

bzoj2434 [Noi2011]阿狸的打字机 AC自动机

Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机。打字机上只有28个按键,分别印有26个小写英文字母和’B’、’P’两个字母。 经阿狸研究发现,这个打字机是这样工作的: l 输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后)。 l 按一下印有’B’的按键,打字机凹槽中最后一个字母会消失。 l 按一下印有’P’的按键,打字机会在纸...

olahiuj的博客 256

YOLO格式数据集划分

YOLO格式的数据集划分 标题标签格式txt import os import cv2 import random from PIL import Image # os.makedirs('labels_train') # os.makedirs('labels_val') img_train_path ='./img_train/' #图片训练集保存路径 img_val_path = './img_val/' #图片验证集保存路径 labels_train_path = './labels_t

weixin_51154380的博客 3308

Python爬取谷歌学术全攻略:基于Playwright与Asyncio的高效、抗反爬虫实践

同时,文章将详细解析爬虫过程中可能遇到的各种挑战,如IP封锁、验证码、动态内容加载等,并提供切实可行的解决方案。self.logger.info(f"第 {current_page} 页解析完成,共找到 {len(page_results)} 条结果。:谷歌学术的HTML结构并非一成不变,其CSS类名和标签结构可能会发生变化,且不同地区、不同语言的界面可能存在差异,增加了数据解析的难度。self.logger.info(f"开始搜索关键词: '{keyword}',计划爬取 {max_pages} 页")

2201_76125261的博客 1550

BJOI2019 游记

BJOI 2019 游记 Day 1 开场拿到 \(T1\) 发现可以转成求平均 \(log\) 直接 \(AC\) 自动机上 \(Dp\) 一波即可 \(T2\) 发现是到数论神仙题,大概能想到要用斯特林数转成 \(k\) 次幂求和之类的,但是通项公式那套东西推不动,打暴力 \(T3\) 是一道 **** 好题,显然可以平衡树之类的分裂加合并一波就做完了,但是 **** ,所以邓老师没有阿克 预...

weixin_30258027的博客 366

【原理图PCB专题】原理图图纸锁定/解锁与PCB文件加密方式

在工作中我们会遇到需要冻结原理图进行评审和加密图纸防止被他人盗用的需求。那么在OrCAD Capture中如何对图纸进行锁定与解锁,如何在Allegro中对PCB工程进行加密呢?

一点硬件 3256

【NOI2016】区间(线段树+离散化)

线段树+离散化

Flanoc的博客 708

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最小K度限制生成树

算法目的:给出V0,KV_{0},K和一个带边权的无向图,求出在V0V_{0}的度数最多为KK的限制下的最小生成树预备知识:最小生成树、动态规划定义:强制K度最小生成树为所有生成树中V0V_{0}的度数为KK的权值最小的生成树大概思路:先把V0V_{0}和V0V_{0}有关的边都删除,假设现在的图分成了MM个联通块,则我们可以得知对于任何生成树V0V_{0}的度数至少为MM。那么我们依次求出强制M度

commonc的博客 2228

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

BZOJ4385: [POI2015]Wilcze doły

题目大意:给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0。请找到最长的一段连续区间,使得该区间内所有数字之和不超过p。 长度肯定为d啊,不用想! 那就先算出以每个长度为d的总和g 然后就相当于维护一个队列,每次在后面新加入一个数的时候,查询在这段区间内最大的g,看这些数总和减去这个最大值是否小于等于p,如果不是就说明太长了,得删掉队头 这样

commonc的博客 1746

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

BZOJ4784: [Zjoi2017]仙人掌

题目大意:给你一个无重边无自环的无向连通图,问有多少种加边方法,使得加完边之后这个图是一个仙人掌 好像蛮厉害的一个题 我们把仙人掌想象成DFS树+返祖边,显然返祖边连接的两个点之间的路径不能有交 因为题目中说了不能有重边,所以我们可以想象把最后仙人掌的那些“桥”又连了一条边,这样就变成了我们要把DFS树上所有的边都用“返祖边两点之间的路径”来覆盖 这个我们可以怎么做呢?

commonc的博客 1574

BZOJ2794: [Poi2012]Cloakroom

题目大意:n个物品有三个属性a,b,c,q个询问每次给出m,k,s,问能不能在物品中选出一些使得每个的a≤m,b>m+s,c的和正好等于k 看完题感觉无从下手.... 然后就去翻了题解,感觉还是挺水的.... 先离线,把询问按m排序,物品按a排序,这样就相当于每次添加物品,问能不能在正好凑出c的情况下让最小的b大于m+s 这就可以直接背包了.... 时间复杂度O(QlogQ+N*

commonc的博客 1464

BZOJ4379: [POI2015]Modernizacja autostrady

题目大意:给定一棵无根树,边权都是1,去掉一条边并加上一条新边,输出所有可能的新树的直径中的最小值和最大值 一看就知道肯定是treeDP了 我们可以考虑对于每一条边,假设把它删掉,会得到两棵小树 此时新树的最大直径肯定是把两个小树的直径连起来,使得L=L1+L2+1 而最小直径肯定是连接两个直径的中点,使得L≈max(L1,L2) 所以我们需要得知对于每条边两边的小树的直径分别是

commonc的博客 1445

BZOJ3830: [Poi2014]Freight

题目大意:有两个城镇,从A到B需要的时间为S,然后有N辆列车需要从A到B再回来,任何时刻铁路上只能有向着同一个方向前进的列车,然后每辆列车有一个从A出发的最早出站时间,问所有列车全部回到A站的最早时间 首先经过分析可以得出,这些列车是分批行进的,就是一批列车从A到B再回来,然后下一批列车再走...一定不会出现某辆列车在某一批到了B而留在那里没有跟着下一波回A的浪潮回来而留守B地等待下一次的情况,

commonc的博客 1246

BZOJ3174: [Tjoi2013]拯救小矮人

题目大意: 每个小矮人有臂长和身高,它们可以搭人梯,如果人梯的人高度总和+最上面的人的手的高度>=H,那最上面的人就可以跑,跑了的人不能再搭人梯,问最多能跑几个小矮人 这题...做了好长好长时间啊 貌似从2015年就开始做了,但是当时写了个贪心不对,然后又上网搜题解没看懂,瞎改DP也不对,过了几个月重新做也是WA,今天突然心血来潮写一发就A了... 首先是要按照身高+臂长来排序,但是

commonc的博客 1109

BZOJ3872: [Poi2014]Ant colony

题目大意:给一棵树,对于每个叶子节点,都有g群蚂蚁要从外面进来,每群蚂蚁在行进过程中只要碰到岔路,就将平均地分成岔路口数-1那么多份,然后平均地走向剩下的那些岔路口,余下的蚂蚁自动消失,树上有一个关键边,假如有一群蚂蚁通过了这条边且数量恰好为k,这k只蚂蚁就被吃掉,问一共有多少只蚂蚁被吃掉 显然得从那条关键边倒着推 以这条边作为这棵树的“根”,开始遍历其他的边,遍历到每条边的时候计算一

commonc的博客 1108

BZOJ2425: [HAOI2010]计数

题目大意:给你一个最多50位的数,求在所有通过由他去掉0和重新排列数字顺序能产生的数中,比他小的有多少个首先位数少的肯定有去掉0的操作,我们可以默认是把0挪到了前面 问题就变成了把这些数字重新排列顺序能产生多少个比他小的数 首先需要知道当各个数字个数分别为a0,a1...a9a_{0},a_{1}...a_{9}时,自由排列能产生的数的个数为(a0+a1+...+a9)!a0!a1!...a9!

commonc的博客 1089

BZOJ2526: [Poi2011]Inspection

题目大意:给定一颗n个节点的树,要求求出从每个节点开始的遍历最小代价。一次遍历是指,每次从这个点出发去一个点再回来,代价是这条边边权*2,相邻两次选择的点对于这个点来说不能在同一颗子树里,最后一次可以不用回来,总代价就是每次出去再回来的代价之和 刚一看题,这不SB题吗,一个treeDP维护出来最长链次长链不就完事了吗,每次从一个点转移过来的时候就各种讨论一下就好了 判断误无解的时候,只

commonc的博客 1039

BZOJ2089&2090: [Poi2010]Monotonicity 2

题目大意:给一个数字串和一个符号序列,求一个最长的数字串子序列,使得相邻两项都满足对应位置的符号关系 一开始想了个DP给否掉了.....结果貌似是对的..... 和最长上升子序列类似,F[i]表示以i为结尾最远能匹配到符号序列的第几个 可以画一画然后发现F[i]一定可以由前面的F[j]转移而来 这样可以想到一个O(N^2)的暴力了,然后考虑优化 求最长上升子序列的时候我们可以用一

commonc的博客 1013
上一篇: BZOJ3658: Jabberwocky
下一篇: BZOJ3659: Which Dreamed It
commonc
博客等级 码龄11年 173粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值