COCI19-20#6 Trener题解

news/2024/11/14 15:53:58/文章来源:https://www.cnblogs.com/tangml/p/18546183

COCI19-20#6 Trener

link

一道水题(我真是太弱了啊啊啊啊。

众所周知,看到这个题立刻知道他是要选名字长度为 $1$ 到 $N$ 的,而我们知道他每一个名字,所以可以直接用字符哈希去做,因为他每一个名字的字符数是上一层名字的字符数加一,所以对于哈希每个字符串只需要跑三次,分别是自己的这个序列的哈希,以及去头,去尾的两个哈希值,目的是为了与上一个字符比较。

然后我想的是用加法原理一层层去跑出答案(其实和图论的思想差不多)。

易看出时间复杂度为三次方级别的,在两秒的时限下可以过掉此题。

然后模拟赛时我全部 $MLE$ 到飞起。

$50$ 昏

#include<bits/stdc++.h>
#define int long long#define pb push_back#define P 1145141#define ULL unsigned long longusing namespace std;const int N=51,K=2000,mod=1e9+7;int n,k;
vector<int> G[N][K];
int sum;
int ans[N][K];ULL dt[N][K][3];
ULL Hash(char s[],int i,int len)
{ULL res=0;for(;i<len;i++)res=res*P+s[i]-'a'+1;return res;
}signed main()
{freopen("trener.in","r",stdin);freopen("trener.out","w",stdout);char a[K];cin>>n>>k;for(int i=1;i<=k;i++){cin>>a;dt[1][i][2]=Hash(a,0,strlen(a));}for(int i=2;i<=n;i++){for(int j=1;j<=k;j++){cin>>a;dt[i][j][0]=Hash(a,0,strlen(a)-1);dt[i][j][1]=Hash(a,1,strlen(a));dt[i][j][2]=Hash(a,0,strlen(a));for(int t=1;t<=k;t++){if(dt[i-1][t][2]==dt[i][j][0] || dt[i-1][t][2]==dt[i][j][1])G[i][j].pb(t);}}}for(int i=1;i<=k;i++)	ans[1][i]=1;for(int i=2;i<=n;i++)for(int j=1;j<=k;j++)for(auto t:G[i][j])	ans[i][j]+=ans[i-1][t],ans[i][j]%=mod;for(int i=1;i<=k;i++)	sum+=ans[n][i],sum%=mod;cout<<sum<<endl;return 0;
}

赛后 $5$ 分钟,我发现了我存图的动态数组的空间复杂度也是三次方级别的,直接炸掉。

然后我才看见我原来是可以把这个问题做成一个几乎在线的做法,就是把我向上递推的过程与输入合并在一起,这样就可以使我的数组减少一维。

代码

#include<bits/stdc++.h>
#define int long long#define pb push_back#define P 1145141#define ULL unsigned long longusing namespace std;const int N=51,K=1600,mod=1e9+7;int n,k;
int sum;
int ans[N][K];
vector<int> G[K];
ULL dt[N][K][3];
ULL Hash(char s[],int i,int len)
{ULL res=0;for(;i<len;i++)res=res*P+s[i]-'a'+1;return res;
}signed main()
{freopen("trener.in","r",stdin);freopen("trener.out","w",stdout);
//	char a[K];cin>>n>>k;for(int i=1;i<=k;i++){cin>>a;dt[1][i][2]=Hash(a,0,strlen(a));}for(int i=1;i<=k;i++)	ans[1][i]=1;for(int i=2;i<=n;i++){for(int j=1;j<=k;j++){cin>>a;dt[i][j][0]=Hash(a,0,strlen(a)-1);dt[i][j][1]=Hash(a,1,strlen(a));dt[i][j][2]=Hash(a,0,strlen(a));for(int t=1;t<=k;t++)if(dt[i-1][t][2]==dt[i][j][0] || dt[i-1][t][2]==dt[i][j][1])G[j].pb(t);}for(int j=1;j<=k;j++)for(auto t:G[j])	ans[i][j]+=ans[i-1][t],ans[i][j]%=mod;for(int j=1;j<=k;j++) G[j].clear();}for(int i=1;i<=k;i++)	sum+=ans[n][i],sum%=mod;cout<<sum<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833455.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PNP和NPN三极管区别

主要区别是电流流向和电压不同:1. PNP管子是发射极流入后从基极和集电极流出,NPN管子是基极和集电极流入从发射极流出。 2. PNP管子工作在放大区时电压是,Ue>Ub>Uc,NPN管子工作在放大区时电压时Uc>Ub>Ue。 3. PNP是共阴极,即两个PN结的N结相连做为基极,…

关于伺服电子齿轮比

一、首先是术语解释: 1.编码器分辨率:多少个脉冲每转。如分辨率为18位,代表需要发262144个脉冲转一圈。2.脉冲当量:发一个脉冲,电机能走多少距离,也就是电机的最小精度。 3.丝杆螺距:表示丝杆转一圈多少毫米。 4.减速比:A(从轮):B(主轮) 5.电子齿轮比:分子是电机编码器…

ubuntu destop修改终端字体大小(Terminal)

背景 初始字体太大,窗口小,看不了几行 调整效果舒服多了 可根据自己的需要做调整

CBT

设置扬声器阵列,预先设置扬声器阵列的覆盖角 根据扬声器阵列的覆盖角得到截止频率F 将音频信号小于截止频率F的频段采用空间重采样法进行恒定束宽控制;将音频信号大于或等于截止频率F的频段采用CBT阵列理论进行恒定束宽控制;基本流程图如下:step1: 首先,确定系统参数. 根据…

使用IDEA插件(dbDoc)生成数据库字典

https://blog.csdn.net/taotao6086/article/details/123324472 https://github.com/godmaybelieve

视频智能分析网关视频分析网关吸烟检测预警厂区吸烟行为监测系统

在工业生产和公共安全管理中,吸烟行为的监测和控制是一个重要而紧迫的问题。尤其是在厂区这样的特殊环境中,吸烟不仅违反了安全生产规定,更可能引发火灾等严重安全事故。随着人工智能技术的发展,吸烟检测视频分析网关应运而生,为厂区吸烟行为监测提供了一种高效、智能的解…

时区计算,冬夏令时, 计算历史某一刻的某地区的时区

首先来聊聊冬夏令时 ‌冬令时和夏令时是为了节约能源和充分利用光照资源而设立的时间制度。‌在夏季,许多国家和地区会将时钟拨快一小时,称为夏令时,以便让人们早起早睡,减少照明用电。而在冬季,时钟会拨回标准时间,称为冬令时。‌ 历史背景和实施国家 夏令时的概念最早由…

【跟着阿舜学音乐-笔记】1.09音程与协和度

音程 音程是指两个音之间的距离,即一个音到另一个音经过了多少个音高的音高单位。 其中,所经历的音高单位的数量叫做音数。具有不同音数的音之间的距离叫做度。 音程的下方较低的音称为根音(该说法也用于和弦中,指原位中最低的音),上方较高的音称为冠音。以下给出各音程的…

find me-WP

首先给了四张图片第一张宽高有问题修复一下,之后感觉不对劲少了IDAT,修复一下 49444154就好了 修复好第一张图片之后发现了二维码ZmxhZ3s0X3 在第二张图片发现了压缩包提取出来但解压不了 需要把7Z换成PK解压之后在618发现1RVcmVfc 第四张图片发现cExlX1BsY 第五张Yzcllfc0lN…

某大型商超客户采购数据分析(Spark实战)

写了一些使用sparksql以及spark机器学习来进行数据分析的东西,希望能给大家做一些参考项目需求:对某大型商超客户采购数据集进行数据分析 数据来源:https://www.heywhale.com/mw/dataset/656069b19a74cc18269207c4/content首先使用Spark读入数据集,读入文件前要先将文件转为…

2024鹏城杯-re

Rafflesia 先去花指令 a = H@^jHwpsH)[jH{M/\\tBBK_|-O{W.iJZ7\\)|~zaB^H+Lwv{SS|-j@\\_[Y flag = for i in range(len(a)):flag += chr(ord(a[i])^0x18) print(flag)PXFrPohkP1CrPcU7DlZZSGd5WcO6qRB/D1dfbyZFP3ToncKKd5rXDGCA 接着是tls改了表 HElRNYGmBOMWnbDvUCgcpu1QdPqJ…

IDEA如何创建web项目及tomcat设置等

一、Java EE插件启用 1.在启动IDEA时,点击右下角并进入Plugins设置2.选择Java EE相关插件,点击OK然后重启二、创建Web项目 1.点击File->New Project,点击Java Enterprise,勾选web Application。确保已选择正确的jdk2.输入项目名称和存放路径,点击Finish完成三、设置tomca…