[USACO06DEC] Milk Patterns G

news2024/10/6 20:40:46

目录

1.题目

2.思路

1.字典树(trie 树)

2.hash(正解)

1.有注释版

2. copy 版

3.后文

1.题目

Farmer John has noticed that the quality of milk given by his cows varies from day to day. On further investigation, he discovered that although he can't predict the quality of milk from one day to the next, there are some regular patterns in the daily milk quality.

To perform a rigorous study, he has invented a complex classification scheme by which each milk sample is recorded as an integer between 0 and 1,000,000 inclusive, and has recorded data from a single cow over N (1 ≤ N ≤ 20,000) days. He wishes to find the longest pattern of samples which repeats identically at least K (2 ≤ K ≤ N) times. This may include overlapping patterns -- 1 2 3 2 3 2 3 1 repeats 2 3 2 3 twice, for example.

Help Farmer John by finding the longest repeating subsequence in the sequence of samples. It is guaranteed that at least one subsequence is repeated at least K times.

(某朋友:不要说鸟语)

好的好的,说中文······ 

农夫John发现他的奶牛产奶的质量一直在变动。经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠。我们称之为一个“模式”。 John的牛奶按质量可以被赋予一个0到1000000之间的数。并且John记录了N(1<=N<=20000)天的牛奶质量值。他想知道最长的出现了至少K(2<=K<=N)次的模式的长度。比如1 2 3 2 3 2 3 1 中 2 3 2 3出现了两次。当K=2时,这个长度为4。

一句话描述一下:

在数组里找到重复了k次的最长字串。

2.思路

1.字典树(trie 树)

虽然当时是考Hash

但我毅然决然的使用了字典树······

(确实很像模板)

再加上hash(114514,1919810)个优化后

荣获70(疯狂TLE)······

还是友好的给一下源码吧······

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long

const int N=2002000;
int son[N][27],a[N],n,k,mx,idx;
struct zmx{int l,ans;}cnt[N+3000];

inline int read()
{
    int x=0,w=0;char c=0;
    while(!isdigit(c)) {w|=c=='-';c=getchar();}
    while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return w?-x:x;
}

void insert(string str,int l)
{
    int p=0;
    for(register int i=0;str[i];i++)
    {
        int u=str[i]-'0';
        if(!son[p][u]) son[p][u]=++idx;
        p=son[p][u];
    }
    cnt[p].ans+=1;
    cnt[p].l=l;
}

signed main()
{
    n=read(),k=read();
    for(register int i=1;i<=n;i++) a[i]=read();
    for(register int i=1;i<=n;i++)
    {
    	string s="";
    	for(register int j=i;j<=n;j++)
		{
			s+=char(a[j]+'0');
			insert(s,j-i+1);
		}
	}
	for(int i=1;i<N+3000;i++)
		if(cnt[i].ans==k&&cnt[i].l>mx) mx=cnt[i].l;
	cout<<mx;
	return 0;
}

2.hash(正解)

首先,数据告诉你:nlogn是一个极限(?)

所以由此推出:一定是前缀Hash。

知道了这个,任务就解决了一半。

同样的:nlogn还告诉你:二分适合用一用。

所以另一半就是二分答案。

所以基本完了(真的吗???)

既然是最大值,就是upper_bound

对了,用双重Hash防止冲突。

所以Hash函数即为:

for(int i=1;i<=n;i++) h1[i]=h1[i-1]*p,h[i]=h[i-1]*p+a[i];

查找即为

return h[r]-h[l-1]*h1[r-l+1];

然后?没有然后了呗!(好水呀qwq)

Q:关于为用二分答案有单调性否?

A:
对于一个长度为n的串s,s加上某个字符组成一个长度为n+1的串t
t在原串中的出现次数<=s在原串中的出现次数

即关于长度有单调性 可以二分答案长度

1.有注释版

#include<bits/stdc++.h>//前缀哈希+双重哈希 
using namespace std;
#define int unsigned long long//小心而谨慎的开了ULL(当然,是60分把我搞蒙了乱开的) 

const int p=13331;//没错,60分的真正原因是这个 
const int N=100010;//数组大小 
int a[N],n,k,ans,h1[N]={1},h[N];//oh,定义 
map<int,int>mp;//记录某长度的字串的出现次数 

int Hash(int l,int r) {return h[r]-h[l-1]*h1[r-l+1];} //美妙的hash 

bool check(int mid)//二分答案 
{
	int ans=0;
	for(int r=mid;r<=n;r++)
	{
		mp[Hash(r-mid+1,r)]++;//I love map!!! 
		ans=max(ans,mp[Hash(r-mid+1,r)]);//看一看出现的所有长度为mid的串统计个数
		                                 //看看有没有一种子串出现>=k次即可
	}
	return ans>=k;//划分 
}

signed main()
{
	scanf("%u%u",&n,&k);//读入 
	for(int i=1;i<=n;i++) scanf("%u",&a[i]);//读入 
	for(int i=1;i<=n;i++) h1[i]=h1[i-1]*p,h[i]=h[i-1]*p+a[i];//Hash 
	int l=0,r=n+1;//l&&r 
	while(l+1<r)//二分答案 
	{
		int mid=(l+r)/2;
		if(check(mid)) l=mid;//二分 
		else r=mid;//二分 
	}
	printf("%u",l);//输出 
	return 0;
}

2. copy 版

#include<bits/stdc++.h> 
using namespace std;
#define int unsigned long long

const int p=13331;
const int N=100010;
int a[N],n,k,ans,h1[N]={1},h[N];
map<int,int>mp;

int Hash(int l,int r) {return h[r]-h[l-1]*h1[r-l+1];}

bool check(int mid)
{
	int ans=0;
	for(int r=mid;r<=n;r++)
	{
		mp[Hash(r-mid+1,r)]++;
		ans=max(ans,mp[Hash(r-mid+1,r)]);
	}
	return ans>=k;
}

signed main()
{
	scanf("%u%u",&n,&k);
	for(int i=1;i<=n;i++) scanf("%u",&a[i]);
	for(int i=1;i<=n;i++) h1[i]=h1[i-1]*p,h[i]=h[i-1]*p+a[i];
	int l=0,r=n+1;
	while(l+1<r)
	{
		int mid=(l+r)/2;
		if(check(mid)) l=mid;
		else r=mid;
	}
	printf("%u",l);
	return 0;
}

3.后文

最后?

点个赞呗!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【洛谷】P2004 领地选择(二维前缀和)

二维前缀和模板啦&#xff0c;家人们&#xff0c;一眼出 pos:&#xff08;up自己犯的错误&#xff0c;记录一下&#xff0c;也提醒大家&#xff09; x1<n-c1(1哦) y1<m-c1 x2x1c-1(-1哦) y2y1c-1 okk,上&#xff01; ACcode: #include<bits/stdc.h> using na…

C/C++封装:Windows/Linux下封装.lib/.so文件

C/C TCP/IP通信函数 这里提供了两个C/C中服务器与客户端之间通讯的两个程序&#xff0c;程序中封装了通信之间的函数方法&#xff0c;我们以这个程序为例进行封装。 文件目录结构按照C/C标准开源项目进行存放&#xff1a; ├─bin ├─doc ├─lib └─src├─xsocket│ │ …

influxdb 新增数据失败原因解析

前几天本地装了一个influxdb时序数据库&#xff0c;但是通过java新增数据一直失败&#xff0c;奇怪的是measurement和tag都能顺利添加&#xff0c;但是field一直没值。 最开始以为是用户权限&#xff0c;结果发现并不是。 最终原因&#xff1a;influxdb只能往默认的保留策略里…

中国人民大学与加拿大女王大学金融硕士——在职读研为自己而战,为未来而战

还记得去年大街小巷上广为流传的一首歌吗&#xff0c;“去吗 去啊 以最卑微的梦&#xff0c;战吗 战啊 以最孤高的梦&#xff0c;致那黑夜中的呜咽与怒吼&#xff0c;谁说站在光里的才算英雄”。这首歌表达了卑微的生活和梦想并不能击垮每个平凡的奋斗者。我们都有一个大梦想&a…

windbg 双机调试环境搭建(虚拟机)

windbg 双机调试环境搭建&#xff08;虚拟机&#xff09; WinDbg 下载安装下载安装 虚拟机下载安装下载安装虚拟机软件 VMware下载 Windows 镜像&#xff0c;新建虚拟机 WinDbg 建立连接使用演示参考资料 WinDbg 是一个调试器&#xff0c;可用于分析故障转储、调试实时用户模式…

提高驾驶安全性 | 基于ACM32 MCU的胎压监测仪方案

概述 作为车辆的基础部件&#xff0c;轮胎是影响行车安全不可忽视的因素之一。据统计&#xff0c;中国每年由胎压问题引起轮胎爆炸的交通事故约占 30%&#xff0c;其中 50%的高速交通事故是由车辆胎压异常引起。因此&#xff0c;准确实时地监测车辆在行驶过程中的轮胎压监测系…

HarmonyOS/OpenHarmony应用开发-程序包多HAP机制(下)

三、多HAP的开发调试与发布部署流程 &#xff08;一&#xff09;多HAP的开发调试与发布部署流程如下图所示。 图1 多HAP的开发调试与发布部署流程 &#xff08;二&#xff09;开发 开发者通过DevEco Studio工具按照业务的需要创建多个Module&#xff0c;在相应的Module中完成…

【Unity 实用插件篇】 | 使用Fungus插件制作一个对话系统,简单好学易上手

前言 【Unity 实用插件篇】| 使用Fungus插件制作一个对话系统&#xff0c;简单好学易上手一、Fungus介绍二、Fumgus导入三、Fungus功能使用3.1 基础对话效果实现3.2 搭建简单场景测试3.3 触碰 对话3.4 条件对话3.4 分支 对话3.5 改变对话UI视图 四、常用功能菜单介绍4.1 Flowch…

【前端】自制密码展示隐藏按钮

效果 一、前期准备 使用的图片是iconfront上拿的svg代码环境是Vue2 Element 二、创建组件 showPasswordAndclose <template><span class"show-password-container"><span v-if"chooseType CLOSE" click"changeType"><…

一文读懂Nacos原理及实践

文章目录 0. 前言0.nacos 介绍什么是 Nacos&#xff1f;Nacos 地图 1. 原理解析1.1 服务注册与发现流程一、服务注册流程二、服务发现流程三、注册中心高可用性机制 1.2. 原理解析一、服务注册与发现的概念二、服务注册与发现的流程2. 服务发现流程3. 服务负载均衡流程 三、服务…

javascript 将json数据导出excel

<el-button type"primary" plain v-on:click"jsonToExcel();">导出</el-button>jsonToExcel() {const data this.AlarmData;let head "城市,站点,时间,A相电流(A),B相电流(A),C相电流(A),SO2压力(MPa),CO压力(MPa),NOX压力(MPa),A相电压…

Activity引擎(初次学习与总结梳理全记录,包括易混淆知识点分析,常用报错解决方案等)

最近工作需要使用Acticity框架处理审批业务&#xff0c;简单了解后能虽能很快的上手&#xff0c;但是对于Activity的整体认识并不够&#xff0c;特此花费很多精力全面的学习并记录。包含对很多的概念的第一次理解过程&#xff1b;对知识点的混淆地方的梳理&#xff1b;对实践过…

mysql索引优化和锁

mysql索引优化和锁 IO操作与索引 IO操作上数据库性能的瓶颈之一&#xff0c;每次进行IO操作都需要消耗时间和资源。 核心:尽量减少 IO 操作的次数 读取次数少且读取量少是优化IO操作的核心目标。采用分块读取和局部性原理。 分块读取&#xff1a;将磁盘上的数据划分为若干…

黑马程序员编著过哪些教材?

黑马程序员是一家知名的IT培训机构&#xff0c;他们发布了许多教材和课程。 《Python入门教程》&#xff1a;介绍Python编程语言的基础知识和常用技巧。 《Java从入门到精通》&#xff1a;全面介绍Java编程语言的基础知识和高级特性。 《Web前端开发教程》&#xff1a;涵盖HT…

JDK压缩包安装,tomcat压缩包安装

1.解压JDK后进入我的电脑高级设置 2.新建系统变量&#xff08;变量名为JAVA_HOME&#xff0c;值为jdk文件夹的绝对地址&#xff09; 3.再次新建系统变量&#xff08;变量名为CLASSPATH&#xff0c;值为.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar&#xff09; 4.进入系…

教你如何快速准确地掌握AI最新技术

文章整理自&#xff1a;https://twitter.com/jbhuang0604/status/1426039195542360070?s21 人工智能领域如何follow最新技术&#xff1f;这应该是咱们这个行业非常关心的问题之一吧。 当你刚开始进行研究时&#xff0c;会发现每年都有成千上万的论文&#xff0c;如何在这些海…

代码随想录二刷day55 | 动态规划之子序列 392.判断子序列 115.不同的子序列

day55 392.判断子序列1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 115.不同的子序列1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历…

python+allure+jenkins

目录 前言 在 python 中使用 allure 1. 安装 pytest 2. 安装 pytest-allure-adaptor 3. 使用 pytest 执行测试用例并生成 allure 中间报告&#xff08;此步骤可以省略&#xff0c;因为在 jenkins job 中会配置执行类似的命令&#xff09; 4. Jenkins 中安装Allure Jenkin…

测试老鸟整理,Jmeter常用线程组+场景实例,一篇速通测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Jmeter中通过线程…

FITC标记牛血清白蛋白(FITC-BSA)溶解性

FITC-BSA是一种常用的荧光探针&#xff0c;用于生物化学和细胞生物学研究。FITC-BSA具有溶解性&#xff0c;可以在溶液中均匀分布。 溶解性1&#xff1a; FITC标记的牛血清白蛋白&#xff08;FITC-BSA&#xff09;在适当的条件下具有良好的溶解性。FITC-BSA通常以固体形式供应…