- 浏览: 396333 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
wsyzyrxp:
非常感谢 兄弟 帮了我大忙
[opengl]弹簧质点法模拟柔性布料以及椭球碰撞的opengl实现 -
mingdry0304:
[opengl]彩色立方体旋转 -
tyfengyu:
我刚刚更改的代码加上了标准差stdVal,故recoMat应该 ...
[python]用python实现的pca算法 -
tyfengyu:
python的pca代码有2处错误:1.finalData = ...
[python]用python实现的pca算法 -
暴风雪:
McFlurry 写道前排(凑字数)!擦你怎么摸来这里的
诈尸总结
大致题意:
给出一个字符串,求出内部循环次数最多的子串。如果答案有多个,输出字典序最小的。
大致思路:
先穷举长度L,然后求长度为L 的子串最多能连续出现几次。首先连续出现1 次是肯定可以的,所以这里只考虑至少2 次的情况。假设在原字符串中连续出现2 次,记这个子字符串为S,那么S 肯定包括了字符r[0], r[L], r[L*2],r[L*3], ……中的某相邻的两个。所以只须看字符r[L*i]和r[L*(i+1)]往前和往后各能匹配到多远,记这个总长度为K,那么这里连续出现了K/L+1 次。最后看最大值是多少
以上内容摘自罗穗骞论文,花了好几天理解照着上面敲出来的,比赛时如果碰到这样的题肯定会被爆。不过ac之后又加深了对后缀数组的理解
#include<iostream> #include<cstdio> #include<vector> #include<cstring> using namespace std; const int nMax =1000012; int num[nMax]; int sa[nMax], rank[nMax], height[nMax]; int wa[nMax], wb[nMax], wv[nMax], wd[nMax]; int cmp(int *r, int a, int b, int l){ return r[a] == r[b] && r[a+l] == r[b+l]; } void da(int *r, int n, int m){ // 倍增算法 r为待匹配数组 n为总长度 m为字符范围 int i, j, p, *x = wa, *y = wb, *t; for(i = 0; i < m; i ++) wd[i] = 0; for(i = 0; i < n; i ++) wd[x[i]=r[i]] ++; for(i = 1; i < m; i ++) wd[i] += wd[i-1]; for(i = n-1; i >= 0; i --) sa[-- wd[x[i]]] = i; for(j = 1, p = 1; p < n; j *= 2, m = p){ for(p = 0, i = n-j; i < n; i ++) y[p ++] = i; for(i = 0; i < n; i ++) if(sa[i] >= j) y[p ++] = sa[i] - j; for(i = 0; i < n; i ++) wv[i] = x[y[i]]; for(i = 0; i < m; i ++) wd[i] = 0; for(i = 0; i < n; i ++) wd[wv[i]] ++; for(i = 1; i < m; i ++) wd[i] += wd[i-1]; for(i = n-1; i >= 0; i --) sa[-- wd[wv[i]]] = y[i]; for(t = x, x = y, y = t, p = 1, x[sa[0]] = 0, i = 1; i < n; i ++){ x[sa[i]] = cmp(y, sa[i-1], sa[i], j) ? p - 1: p ++; } } } void calHeight(int *r, int n){ // 求height数组。 int i, j, k = 0; for(i = 1; i <= n; i ++) rank[sa[i]] = i; for(i = 0; i < n; height[rank[i ++]] = k){ for(k ? k -- : 0, j = sa[rank[i]-1]; r[i+k] == r[j+k]; k ++); } } int Log[nMax]; int best[20][nMax]; void initRMQ(int n) {//初始化RMQ for(int i = 1; i <= n ; i ++) best[0][i] = height[i]; for(int i = 1; i <= Log[n] ; i ++) { int limit = n - (1<<i) + 1; for(int j = 1; j <= limit ; j ++) { best[i][j] = min(best[i-1][j] , best[i-1][j+(1<<i>>1)]); } } } int lcp(int a,int b) {//询问a,b后缀的最长公共前缀 a = rank[a]; b = rank[b]; if(a > b) swap(a,b); a ++; int t = Log[b - a + 1]; return min(best[t][a] , best[t][b - (1<<t) + 1]); } char str[nMax]; int ans[nMax]; int main(){ int i,j,n,cas=0; Log[0] = -1; for(int i=1;i<=nMax;i++){ Log[i]=(i&(i-1))?Log[i-1]:Log[i-1] + 1 ; } while(scanf("%s",str)!=EOF&&str[0]!='#'){ n=strlen(str); for(i=0;i<n;i++){ num[i]=str[i]-'a'+1; }num[n]=0; da(num, n + 1,30); calHeight(num,n); initRMQ(n); int l,r,t,k,maxx=-1,a; for(l=1;l<n;l++){ //枚举长度 for(i=0;i+l<n;i+=l){ k=lcp(i,i+l); r=k/l+1; t=l-k%l; t=i-t; if (t>=0&&k%l!=0){ if(lcp(t,t+l)>=k) r++; } if(r>maxx){ a=0; maxx=r; ans[a++]=l; } if(a==maxx){ ans[a++]=l; } } } int start,b=0,c; for(i=1;i<=n&&!b;i++){ //sa数组是保证字典序的神器啊 Orz for(j=0;j<a;j++){ int tl=ans[j]; if(lcp(sa[i],sa[i]+tl)>=(maxx-1)*tl){ start=sa[i]; l=tl*maxx; b=1; break; } } } printf("Case %d: ",++cas); for (int i=0;i<l;i++) printf("%c",str[start+ i]); printf("\n"); } return 0; }
发表评论
-
[树状数组]poj 2299
2014-12-13 20:58 1942题意 求一列数字的逆序数。 思路 ... -
[树状数组]hdoj 1166
2014-12-12 01:21 2题意 http://acm.hdu.edu.cn/ ... -
[树状数组]hdoj 1166
2014-12-12 01:21 912题意 http://acm.hdu.edu.cn/ ... -
[离散化+线段树]poj2528
2014-12-01 23:16 640题意 给出每个海报的位置,问最后没有被完全覆盖 ... -
[线段树区间合并]poj 3667
2014-12-01 11:45 821i题意 和poj1823差不多,加了一个查 ... -
[线段树区间更新]poj 1823
2014-12-01 02:56 912题意 一个旅馆有n个房间,有m次操作,每次操作可 ... -
[线段树]poj 3368
2014-11-29 07:58 784题意 给出一串数字,有m次询问,每次询问[ab ... -
[线段树成段更新]poj 2777
2014-11-28 01:33 1166题意: 一段区间从1-n的初始颜色为1,每 ... -
[线段树]poj 2182
2014-11-27 23:13 637题意: n头牛站队,每头牛都有一个属于[ ... -
[线段树]poj 3264
2014-11-27 21:57 537题意 给出一串数字,m个询问,对于每次询问求出 ... -
[线段树成段更新]hdoj 1698
2014-11-27 21:00 750题意: 对一个线段上的值进行修改,一次可以把[i, ... -
[线段树成段更新]poj 3468
2014-11-27 12:43 723题意: 给出一串n个数,每次操作分为两种,分 ... -
[线段树]poj 2828
2014-11-26 22:02 757题意 n个人插队,每次某个人都会选择插入第i个 ... -
[线段树]hdoj 2795
2014-11-25 20:33 894题意:一个高h宽w的二维空间,每次放进去一个高为1,宽为a的 ... -
[线段树]hdoj 1394
2014-11-24 22:40 976题意 给出一列n个数字,每一个数字都和其他 ... -
[后缀数组]acdream 1430
2014-10-16 14:08 549大致题意: 求出一个字符串(len<=1 ... -
[KMP+乱搞]hdoj 4749
2014-10-11 15:22 803大致题意: 求文本串中最多能选出多少子串,使得这 ... -
[KMP]hdoj 4763
2014-10-10 11:39 719题意: 给出一个字符串,问是否存在这样的子串E使得 ... -
[后缀数组][二分]hdu 5008
2014-09-27 10:10 1066大致题意: 给出一个长度小于100000的字符串 ... -
[线段树,单点更新]hdoj 1754:I Hate It
2012-10-21 21:33 1333大致题意: 给出一个数组,在线更新点的值,查询区 ...
相关推荐
内容概要:本文详细介绍了如何使用TensorRT加速YOLOv5模型推理,并结合QT框架搭建一个多任务并行处理的智能监控平台。主要内容包括:YOLOv5与TensorRT的融合,通过将YOLOv5模型转换为ONNX格式并进一步转化为TensorRT引擎,从而大幅提升推理速度;QT框架的应用,利用其跨平台特性实现视频监控、录像回放、电子地图等多种功能;16路视频并行检测的具体实现,通过多线程机制和CUDA流的支持,确保系统的高效运行。此外,文章还探讨了模型热更新、网络流处理、日志记录等方面的优化措施。 适合人群:具备一定编程基础,尤其是熟悉C++、Python和深度学习框架的研究人员和技术开发人员。 使用场景及目标:适用于需要高效、智能监控解决方案的企业和个人开发者。主要目标是提高视频监控系统的效率和智能化水平,如安防监控、交通监测等领域。 其他说明:文中提供了大量代码示例,帮助读者更好地理解和应用所介绍的技术。同时强调了系统设计中的性能优化技巧,如内存管理和多线程调度等。
反极域和远程机惨的好工具
内容概要:本文详细介绍了如何利用MATLAB的GUI界面模拟电子双缝衍射实验。通过创建自定义的GUI界面,用户可以输入缝宽a、双缝间距b、加速电压U、缝屏距离D以及电子数目n等参数,实时观察衍射图样的变化。文中不仅提供了详细的代码实现步骤,还解释了各个参数对衍射图样的具体影响,如缝宽a的变化会影响条纹宽度,加速电压U的变化会影响条纹间距等。此外,文章还讨论了一些特殊情况下(如缝间距过大)的非预期现象及其背后的物理原因。 适合人群:物理学专业学生、教师以及对量子力学感兴趣的科研工作者。 使用场景及目标:①作为教学辅助工具,帮助学生更直观地理解电子双缝衍射实验及其背后的物理原理;②作为一种研究手段,探索不同参数条件下电子双缝衍射的具体表现形式。 其他说明:作者提醒使用者不要将电子数目n设得过高以免造成程序运行缓慢,并指出了一些常见的错误配置可能导致的异常情况。同时,提供了一个GitHub链接供有兴趣的读者进一步探讨和改进。
实训商业源码-qui-pure.v2.5-毕业设计.zip
scratch少儿编程逻辑思维游戏源码-有弹性的…猫.zip
内容概要:本文详细介绍了汇川H3U系列可编程控制器在多轴伺服定位控制方面的应用案例。文章分为三个主要部分:一是本体脉冲控制的三轴伺服定位,展示了通过梯形图实现脉冲输出控制轴运动的方法;二是总线控制的16轴汇川伺服定位,利用结构体数组管理和初始化多个轴的数据,实现了高效的总线通信;三是具体的功能实现,包括轴点动、回零、相对定位与绝对定位等功能的代码示例及其工作原理。此外,文中强调了模块化设计的重要性,通过合理的分层架构提高了系统的灵活性和稳定性。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对伺服控制系统感兴趣的初学者和有一定经验的研发人员。 使用场景及目标:适用于需要理解和掌握多轴伺服定位控制原理的实际工程项目中,旨在帮助读者深入理解汇川H3U控制器的工作机制,掌握具体的编程技巧,以便更好地应用于实际生产环境。 其他说明:文章不仅提供了详细的代码示例,还分享了许多宝贵的实践经验,如状态机的应用、异常处理机制等,这些都是提高程序可靠性的关键因素。
内容概要:本文详细介绍了二进制比较器的设计原理与实现方法。文章首先讲解了二进制比较器的基本概念,包括32位数字比较器的原理图绘制方法。文中提到可以使用二进制比较芯片(如74LS85)组合实现大于、等于、小于的功能,其中不等是通过大于和小于的或逻辑并归实现,大于则是芯片固有的功能,小于等于则是等于和小于的或逻辑并归。对于门电路合成,文章提到了使用74LS04D+08+86等元件组成一位二进制比较器,但指出位数增加会使逻辑变得复杂,不推荐自行合成。此外,还介绍了2位二进制比较器的工作原理,当高位不同时无需比较低位,只有当高位相同时才需要比较低位。最后,文章讨论了集成数值比较器74LS85的功能及其位数扩展方式,包括串联和并联两种扩展方法。 适合人群:具有一定的数字电路基础,对二进制比较器感兴趣的电子工程学生或工程师。 使用场景及目标:①理解二进制比较器的基本原理和工作方式;②掌握二进制比较器的硬件实现方法,特别是如何利用现有芯片构建多位比较器;③学习如何通过逻辑门电路实现简单的二进制比较功能。 阅读建议:读者在学习过程中应结合实际电路图和逻辑表达式进行理解和验证,特别是对于不同位数的二进制比较器,可以通过实际搭建电路来加深理解。
实训商业源码-昂图文10.2.20 公众号版-毕业设计.zip
【实用脚本工具】相关内容与技巧的【VIP资源】,包
scratch少儿编程逻辑思维游戏源码-宇宙幽灵 Boss 之战.zip
内容概要:本文详细介绍了基于西门子S7-200 PLC和组态王的机械手搬运控制系统的实现方案。首先,文章展示了梯形图程序的关键逻辑,如急停连锁保护、水平移动互锁以及定时器的应用。接着,详细解释了IO分配的具体配置,包括数字输入、数字输出和模拟量接口的功能划分。此外,还讨论了接线图的设计注意事项,强调了电磁阀供电和继电器隔离的重要性。组态王的画面设计部分涵盖了三层画面结构(总览页、参数页、调试页)及其动画脚本的编写。最后,分享了调试过程中遇到的问题及解决方案,如传感器抖动、输出互锁设计等。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是对PLC编程和组态软件有一定基础的读者。 使用场景及目标:适用于自动化生产线中机械手搬运控制系统的开发与调试。目标是帮助读者掌握从硬件接线到软件逻辑的完整实现过程,提高系统的稳定性和可靠性。 其他说明:文中提供了大量实践经验,包括常见的错误和解决方案,有助于读者在实际工作中少走弯路。
内容概要:本文详细介绍了如何使用MATLAB对声发射波形进行参数计算和单边振幅谱绘制。主要内容涵盖声发射波形的基本参数(如峰值振幅、上升时间和持续时间)、特征参数(如均方根振幅和能量)的计算方法,以及通过快速傅里叶变换(FFT)绘制单边振幅谱的具体步骤。文中提供了详细的MATLAB代码示例,帮助读者理解和实现这些操作。 适合人群:从事材料科学、无损检测等相关领域的研究人员和技术人员,尤其是有一定MATLAB基础的用户。 使用场景及目标:适用于需要对声发射信号进行深入分析的研究项目,旨在提高对声发射事件的理解和诊断能力。具体应用场景包括但不限于材料疲劳测试、结构健康监测等。 其他说明:文中还提到了一些实用技巧,如处理复数信号、使用窗函数减少频谱泄漏、去除直流分量等,有助于提升数据分析的准确性。此外,建议将整个分析流程封装成函数以便于重复使用。
scratch少儿编程逻辑思维游戏源码-寻觅故事者.zip
scratch少儿编程逻辑思维游戏源码-希望奔跑.zip
内容概要:本文深入探讨了单相和三相交流调压技术,详细介绍了这两种技术的工作原理、应用场景以及波形变化规律。首先,文章解释了单相交流调压的基本概念,即通过对单一相位的交流电进行触发角调整来实现电压调节。接着,重点讨论了三相交流调压的特点,特别是在带有中性线的情况下,它能提供更稳定的参考点并支持复杂的工业应用。此外,文中还涉及了桥式半控整流电路的仿真实验,展示了不同触发角和负载条件下的波形变化情况。最后,文章展望了未来交流调压技术面临的挑战和发展机遇。 适合人群:从事电力电子相关行业的技术人员、研究人员及高校师生。 使用场景及目标:帮助读者深入了解单相和三相交流调压技术的具体实现方式,掌握波形变化规律,提升实际操作能力。 其他说明:文章结合理论与实践,既包含了基础知识介绍又涵盖了最新的研究成果和技术趋势。
实训商业源码-【超人】商家联盟 3.2.2-毕业设计.zip
Go语言,通常被称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。它的设计目标是提高开发者的生产力和程序的运行效率,特别适合构建网络服务和分布式系统。在Windows操作系统下,安装Golang开发环境需要下载相应的安装包。这里提供的"Go开发工具,golang IDE安装包,windows系统下"包含了Golang的集成开发环境(IDE)——Goland以及相关的使用说明。 Goland是一款由JetBrains公司推出的专门针对Go语言的高效开发工具,它为Go开发者提供了强大的代码补全、调试、重构和代码审查等功能。Goland-2018.3.exe是该IDE的一个特定版本,可能包含了2018年第三季度的一些更新和改进,用户可以通过执行这个可执行文件来安装Goland。 在安装过程中,用户通常需要选择安装路径,确认是否添加到PATH环境变量,以便在命令行中直接使用go命令。安装完成后,Goland会自动检测并配置Go的编译环境,包括设置GOROOT(Go语言的安装目录)和GOPATH(工作区路径),这对于新手来说是非常方便的。 同时,压缩包中的"golang说明.txt"文件很可能是对如何使用Golang进行开发,以及如何操作Goland IDE的基本指导。这份文件可能涵盖了如何创建新项目、设置Go环境变量、使用内置的包管理器go mod、运行和调试程序等内容。对于初学者来说,这是理解并快速上手Go语言开发的重要参考资料。 在使用Golang进行开发时,有几个关键概念是需要了解的: 1. **GOPATH**:在早期版本中,GOPATH是存放项目源码、编译后的对象文件和第三方包的地方。从Go 1.11版本开始,引入了go modules,但理解GOPATH仍然有助于理解Go的工作方式。 2. **Go Mod
scratch少儿编程逻辑思维游戏源码-西利斯通城堡.zip
内容概要:本文详细介绍了西门子PLC1200博途V16在制药厂生物发酵系统中的应用,涵盖硬件组态、报警功能、模拟量标定、温度PID控制以及称重仪表USS通讯等方面。硬件方面,采用ET200SP模块进行分布式I/O控制,称重仪表通过USS协议与PLC通信。软件方面,通过OB组织块、自定义数据块和函数块实现报警管理、模拟量处理、PID控制等功能。文中还提供了具体的代码示例,展示了如何处理报警、标定模拟量、实现PID控制和USS通讯。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对西门子PLC编程有一定基础的人群。 使用场景及目标:适用于制药厂生物发酵系统的自动化控制项目,帮助工程师理解和掌握PLC编程技巧,提高系统的稳定性和可靠性。具体应用场景包括但不限于:报警管理、模拟量处理、温度控制和称重仪表通讯等。 其他说明:本文不仅提供了详细的代码示例,还分享了许多实际工程中的经验和技巧,如PID参数调整、USS通讯调试、硬件组态注意事项等。对于初学者来说,这是一个很好的学习资料,能够帮助他们在实践中快速成长。
硬件开发教程&案例&相关项目资源,奖励仅限VIP资源