当前位置: 首页 > 编程日记 > 正文

[POJ3261] Milk Patterns

LINK


此题的常规做法是 二分 + 后缀数组 ,但本蒟蒻还是习惯写 并查集 的做法

算法流程

1.离散化是肯定要有的,给的数据太大了,不离散化会RE

2.先跑一遍SA,把最重要的h数组求出来

3.把h从大到小排序,从大到小枚举重复串的长度,同时遍历h数组,若对于\(h_i\)\(h_i\)大于等于当前枚举的长度,就把\(h_i\)所连接的两个节点合并(见下文),求出合并后的并查集的大小,最后再判断一下是否大于题目的要求的大小,若符合要求就输出当前枚举的长度,并结束程序。

整个算法的时间复杂度为\(O(n log_2 n)\),主要性能瓶颈在于排序。

主要解释一下第三个步骤的用意

为什么说\(h_i\)连接了两个节点

首先对于数据 1 1 2 1 1,它的 SA 为 5 4 1 2 3,而\(h_i\)则可以看成连接\(i\)\(i-1\)节点的桥梁

我们回归\(h\)数组的本质,它的意义为排名为\(i\)的后缀与排名为\(i-1\)的后缀的最长公共前缀,则我们可以把\(i\)\(i-1\)看成两个节点,\(h_i\)就是连接这两个节点的无向边,其权值就为\(h_i\)本身的值

并查集大小的意义

若对于一个大小已经大于等于题目要求的个数的并查集,则说明这个并查集里所有点连接的所有边的值都大于等于当前枚举的值,也就是说这一段区间的所有后缀都有一个长度大于等于当前枚举的值的公共前缀,重复的前缀的个数就等于当前并查集的大小

Code:

#include<stdio.h>
#include<algorithm>
using namespace std;
#define rint register int
#define N 200007template<class T>
inline void read(T &x){x=0;char c=getchar();T flag=1;while(c<'0'||c>'9'){if(c=='-')flag=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-48;c=getchar();}x*=flag;
}struct Node{int val,pos;
}pre[N];
struct E{int val,to;
}h[N];
int n,m,lim,a[N];
int rk[N],tp[N],sa[N],cnt[N],fa[N],size[N];inline int find(int x){return (x==fa[x])? x:(fa[x]=find(fa[x]));}
inline bool Cmp1(const Node x,const Node y){return x.val<y.val;}
inline bool Cmp2(const E x,const E y){return x.val>y.val;}
inline void sort_(){for(rint i=0;i<=m;i++) cnt[i]=0;for(rint i=1;i<=n;i++) cnt[rk[i]]++;for(rint i=0;i<=m;i++) cnt[i]+=cnt[i-1];for(rint i=n;i>=1;i--)sa[cnt[rk[tp[i]]]--]=tp[i];
}
inline void SA(){for(rint i=1;i<=n;i++) tp[i]=i,rk[i]=a[i];sort_();for(rint w=1,p=0;p<n;m=p,w<<=1){p=0;for(rint i=n-w+1;i<=n;i++) tp[++p]=i;for(rint i=1;i<=n;i++)if(sa[i]>w) tp[++p]=sa[i]-w;sort_();swap(rk,tp);rk[sa[1]]=p=1;for(rint i=2;i<=n;i++)rk[sa[i]]=(tp[sa[i-1]]==tp[sa[i]]&&tp[sa[i-1]+w]==tp[sa[i]+w])? p:++p;}
}
int main(){read(n);read(lim);for(rint i=1;i<=n;i++) read(a[i]),pre[i]=(Node){a[i],i};sort(pre+1,pre+1+n,Cmp1);for(rint i=1;i<=n;i++)a[pre[i].pos]=(pre[i].val==pre[i-1].val)? m:(++m);
/*  for(rint i=1;i<=n;i++) printf("%d ",a[i]);*/SA();
/*  for(rint i=1;i<=n;i++) printf("%d ",sa[i]);printf("\n");*/int h_=0;for(rint i=1;i<=n;i++){rint t=sa[rk[i]-1];while(a[t+h_]==a[i+h_]) h_++;h[rk[i]].val=h_,h[i].to=i;h_=max(0,h_-1);size[i]=1,fa[i]=i;}sort(h+1,h+1+n,Cmp2);for(int i=n,j=0;i>=0;i--){while(h[j+1].val>=i){rint u=h[++j].to,v=u-1;u=find(u),v=find(v);fa[v]=u;size[u]+=size[v];if(size[u]>=lim){printf("%d",i);return 0;}}}
}

转载于:https://www.cnblogs.com/wwlwQWQ/p/11191158.html

相关文章:

风格化手绘纹理包 CGTrader – Stylized Mix Vol. 41 – Hand Painted Texture Pack

风格化手绘纹理包 CGTrader – Stylized Mix Vol. 41 – Hand Painted Texture Pack CGTrader–风格化混合第41卷–手绘纹理包 大小解压后&#xff1a;343M 信息: 7种风格化材料的包装。格式&#xff1a;. png .uproject .unitypackage 特点: 7种独特的纹理 包括基础颜色/正…

linux开发log示例,RH124-log Linux日志(示例代码)

课程笔记#日志目录[[email protected] log]$ ls /var/log/amanda cron-20170531 glusterfs messages#日志管理服务[[email protected] log]$ systemctl is-active rsyslog.serviceactive#日志服务配置文件[[email protected] log]$ cat /etc/rsyslog.conf# rsyslog configurati…

xamarin 断点 不命中

Async Debugging Breakpoints not being hit breakpoint in Android library project not hit when disable fastdebug and linking sdk assemblies only https://bugzilla.xamarin.com/show_bug.cgi?id17512转载于:https://www.cnblogs.com/zjoch/p/4836883.html

2022-2028年中国饮水机市场投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国饮水机行业市场行业相关概述、中国饮水机行业市场行业运行环境、分析了中国饮水机行业市场…

编辑模式下,控制对象移动

有时候我们可能会有这样的需求&#xff0c;就是在编辑模式下&#xff0c;控制移动场景中的物体&#xff0c;这里面有两个点要解决&#xff1a; &#xff08;1&#xff09;怎么在编辑模式下运行一个脚本&#xff1b; &#xff08;2&#xff09;怎么有效地响应鼠标按键。 第一个问…

2019.07.16

三次握手TCP报文指针内容&#xff1a; 1.URG&#xff1a;紧急指针&#xff0c;当URG1&#xff0c;表明紧急指针字段有效&#xff0c;告诉系统报文有紧急内容。 2.ACK: 确认指针&#xff0c;当ACK1&#xff0c;确认号字段有效。 3.PSH&#xff1a;推送指针&#xff0c;当两个应…

3Dmax+V-Ray学习建筑可视化教程

3DmaxV-Ray学习建筑可视化教程 视频:19201080&#xff0c;. mp4&#xff0c;25 fps |音频:AAC-LC&#xff0c;253 kb/s 2通道&#xff0c;48.0 KHz |流派:电子学习 软件:3Ds Max |时长:5小时 |语言&#xff1a;英语中英文字幕&#xff08;机译&#xff09;|文件大小:3.2 GB …

linux的自定义input,Linux Input子系统之第一篇(input_dev/input_handle/input_handler)

Input子系统是linux kernel中与部分外围器件驱动联系比较紧密的模块&#xff0c;常用于Sensor&#xff0c;TP(touch panel)&#xff0c;power key等器件的驱动。这类模块有个共同特点&#xff1a;字符设备&#xff0c;且数据量都不大&#xff0c;比如sensor一般最多只有xyz三个…

为什么不记录慢速查询?

㈠ 底&#xff1a;2014/8/18 13点37分收到前端说反馈有玩家掉线情况&#xff0c;检查CPU、慢查询、DB请求量&#xff0c;并未发现异常&#xff0c;DB表现一如往常。㈡ 定位原因&#xff1a;INSERT INTO t (col1, col2, col3, col4, col5, col6, col7) VALUES (3532082239485507…

docker常用命令详解

docker常用命令详解 本文只记录docker命令在大部分情境下的使用&#xff0c;如果想了解每一个选项的细节&#xff0c;请参考官方文档&#xff0c;这里只作为自己以后的备忘记录下来。 根据自己的理解&#xff0c;总的来说分为以下几种&#xff1a; Docker环境信息 — docker…

Unity3D脚本属性

Unity3D的脚本属性用法&#xff1a; // JavaScriptscript AddComponentMenu ("Transform/Follow Transform") // CSharp [AddComponentMenu("Transform/Follow Transform")] 以下是具体说明&#xff08;部分无关紧要的不翻译&#xff09;&#xff1a; Add…

Linux下查看.so和可执行文件是否debug编译

如何判断一个.so是否是debug编译的&#xff1f; 如果用此方法&#xff1a;用file来查看一个.so, 根据是否包含”not stripped”来判断该.so是否是debug编译的。然而stripped/not stripped并不是debug/release编译的判断标准. 对debug和release的.so运行file后可得出几乎相同的输…

UE商城资源 Motion Symphony 运动匹配插件

UE商城资源 Motion Symphony 运动匹配插件 Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Motion Symphony 1.05 4.26运动交响曲插件 插件大小解压后&#xff1a;346M 资源大小共 2G 含官方文档 和官方使用视频教程&#xff08;共100分钟 1920X1080 mp4 中…

linux下出现重定义,Oracle Online Redefinition在线重定义

在线重定义特性进行数据表Online的结构变动操作。本篇我们从一个较复杂的案例出发&#xff0c;讨论复杂变化情况下如何进行Online Redefinition&#xff0c;以及dbms_redefinition包各个关键方法的作用。3、一个分区表的重定义动作我们定义一个数据表T。SQL> create table t…

Lr IP欺骗设置

IP欺骗设置IP工具&#xff1a;IP Wizard 开启IP欺骗时会关闭DHCP&#xff08;也就是关闭IP自动获取 更改为手动设置IP&#xff09; 注&#xff1a;添加IP欺骗&#xff0c;和释放IP&#xff0c;都要重启机器后才会生效&#xff0c;IP Wizard要管理员身份运行&#xff1b; 在con…

2022-2028年中国异戊二烯橡胶产业竞争现状及发展规模预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国异戊二烯橡胶行业市场行业相关概述、中国异戊二烯橡胶行业市场行业运行环境、分析了中国异…

Mysql新安装服务启动失败

#备注如果新安装的mysql启动报错,请检查my.cnf文件的innodb_buffer_pool_size设置的值&#xff0c;最好为内存的总大小的70%。转载于:https://blog.51cto.com/azhuang/1553167

js实现图片上传本地预览

演示地址&#xff1a;https://xibushijie.github.io/static/uploadImg.html <!DOCTYPE> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>图片上传本地预览</title><style…

Unity增强现实初学者指南视频教程 A Beginner’s Guide to Augmented Reality with Unity

Unity增强现实初学者指南视频教程 A Beginner’s Guide to Augmented Reality with Unity MP4 |视频:h264&#xff0c;1280720 &#xff08;部分1920X1080&#xff09; |音频:AAC&#xff0c;44100 Hz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&a…

c语言中变量有什么作用是什么,C语言里面局部变量和临时变量有什么区别?

typedefexternstatic_Thread_localregister其中&#xff0c;除了 typedef (放在这里仅仅是为了描述语法方便)&#xff0c;其它几个(配合变量声明的位置)描述了的变量的 linkage 和 storage duration。但是 storage class specifier 跟 linkage / storage duration 并不是一一对…

Android Acitivity 生命周期

Fragment 的生命周期&#xff1a; Android Fragment 生命周期及其API使用&#xff08;建议使用自定义View替换Fragment&#xff09; Activity的生命周期&#xff1a; (1)启动Activity&#xff1a;系统会先调用onCreate方法&#xff0c;然后调用onStart方法&#xff0c;最后调用…

Docker入门六部曲——基本引导

原文链接&#xff1a;http://www.dubby.cn/detail.html?id8733 预备知识 虽然我们接下来还是会介绍很多概念&#xff0c;但是最好还是提前了解什么是Docker&#xff0c;和为什么你会使用Docker。 我们假设你对下面这些知识比较熟悉&#xff1a; IP地址和端口虚拟机编辑配置…

fragment切换事件

2019独角兽企业重金招聘Python工程师标准>>> 我使用fragment fragmenttabhost的时候&#xff0c;如果切换tab&#xff0c;对应的Fragment就会执行onDestroyView &#xff0c;再切换回来又会执行onCreateView()&#xff0c;如此反反复复。destroyView &#xff0c;c…

quartz关闭DBUG日志

使用quartz调度任务&#xff0c;每次启动产生大量debug日志&#xff0c;机器都要被累死了。 试过很多方法都不好使&#xff0c;包括在log4j.properties里配置 quartz源代码&#xff0c;发现它的日志输出用的是slf4j&#xff0c;而不是log4j,所以想到用logback.xml来控制。 把他…

UE卡通风格游戏场景制作视频教程

UE卡通风格游戏场景制作视频教程 UE卡通风格游戏场景制作视频教程 教程大小&#xff1a;4.53G 含项目文件 3840X2160 mp4 语言&#xff1a;英语中英字幕&#xff08;机译&#xff09; 本教程是关于UE4卡通渲染游戏环境场景制作训练视频教程&#xff0c;时长&#xff1a;4小时…

c语言顺序表有效元素长度,用C语言描述的顺序表类型

2.2.1 顺序表用C语言描述的顺序表类型如下所示&#xff1a;// 存储结构const int MAXLISTSIZE80; // 预设的存储空间最大容量typedef struct {ElemType *elem;    // 存储空间基址int length;      // 当前长度int listsize;     //允许的最大存储容量(以sizeof(E…

css样式之边框和内外边距

1、css样式之边框&#xff1a;border 实心的边框&#xff1a; <!DOCTYPE html><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <title>页面一</title> </head> <body>…

2022-2028年中国乙烷行业投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国乙烷行业市场行业相关概述、中国乙烷行业市场行业运行环境、分析了中国乙烷行业市场行业的…

SQL Server 中master..spt_values的应用

今天在做数据分析报表的时候遇到一个这样的问题。表结构如下。部门编码、部门名称、部门人员ID&#xff08;中间用逗号分割&#xff09;我想通过和人员表链接&#xff0c;查询出一个新的数据集&#xff0c;查询出的结果集格式如下&#xff1a;人员信息&#xff08;ID或者姓名&a…

ora-1031解决一例

今天建立了一个测试环境&#xff0c;打算再次测试logical standby的建制。在建制物理standby时&#xff0c;发现archive log无法传递到standby,手工可以。察看log,发现如下错误&#xff1a; Errors in file c:\oracle\product\10.2.0\admin\it\bdump\it_arcp_2116.trc: ORA-010…