给定一个字符串,求所有字串中的最长回文串。
暴力肯定过不了,如果在一个已经求出来的回文串中知道左半边,也肯定知道右半边,那么设 \(d_i\) 为以 \(i\) 为中心的回文串(奇数长度)的最长半径,那么在一个回文串 \([l,r]\) 中,知道 \(d_{l + (r - i)}(l \le i \le r)\),那么回文串的另一边 \(d_i\) 也可以得出,因为回文串两边相同
,d也会相同。
那么对于已经求出来的 \([l, r]\),如果要求 \(d_i\),如果 \(i\) 在区间内(不会比 \(l\) 小,因为那是比它小的编号的回文串的左端点 \(l \le j \le i\)),那么就可以用已经求出来的 \(d_{l + (r - i)}\)(\(r - i\) 相当于是它离末尾有几格,以上图为例(下标从1开始) \(i = 4\), 它离末尾的距离是 \(r - i\), 那么它的对面就是 \(l + (r - i)\),其实可以把它看作:他对面的离起始有几格)来得到 \(d_i\),但是 \(d_i\) 其实是可以继续扩展的,所以在往外扩展扩展即可,如果不在区间内(\(i > r\)),那么没有可以用的,只能自力更生,用 \(n^2\) 的方法做。如果是长度为偶数就改一下即可。
#include <iostream>
#include <string>
using namespace std;
const int MaxN = 1.1e7 + 10;
int d[3][MaxN], n, ans;
string s;
void G(int f, int x) { // 自力更生
while (x - d[f][x] + f - 1 >= 0 && x + d[f][x] < n && s[x - d[f][x] + f - 1] == s[x + d[f][x]]) {
d[f][x]++;
}
d[f][x]--;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> s, n = s.size();
for (int i = 0, l = 0, r = -1; i < n; i++) { // r 好像必需是-1,为了0除可以自力更生
d[1][i] = i > r ? 1 : min(d[1][l + (r - i)], r - i + 1), G(1, i); // 自力更生或是用之前已经算好的
if (i + d[1][i] > r) {
r = i + d[1][i], l = i - d[1][i];
}
ans = max(ans, d[1][i] * 2 + 1);
}
for (int i = 0, l = 0, r = -1; i < n; i++) {
d[2][i] = i > r ? 1 : min(d[2][l + (r - i - 1)], r - i - 1), G(2, i);
if (i + d[2][i] > r) {
r = i + d[2][i], l = i - d[2][i] + 1;
}
ans = max(ans, d[2][i] * 2);
}
cout << ans << '\n';
return 0;
}
最外层的for
肯定运行 \(n\) 次,而 \(r\),肯定是单调不减的,所以也只会最多变 \(n\),自力更生处因为会用到之前已经算出来的,所以也只会最多运行 \(n\) 次,\(l\) 根本不用管,因为是由着 \(r\) 的,所以总共 \(O(n)\)
前面我们实现了通过网络端口来访问运行在docker容器内的服务。容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或-p参数来指定端口映射。下面我们来实现通过端口连接到一个docker容器。网络端口映射我们创建了一个python应用的容器。runoob@runoob:~$dockerrun-d-Ptraining/webapppythonapp.py fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d复制另外,我们可以指定容器绑定的网络地址,比如绑定127.0.0.1。我们使用-P绑定端口号,使用dockerps可以看到容器端口5000绑定主机端口32768。runoob@runoob:~$dockerps CONTAINERIDIMAGECOMMAND...PORTSNAMES fce072cc88cetraining/webapp"pythonapp.py"...0.0.0.0:32768->5000/tcpgrave_hopper复制我们也可以使用-p标识来指
机器之心&ArXivWeeklyRadiostation参与:杜伟、楚航、罗若天本周的重要论文包括来自谷歌大脑的研究团队提出了一种舍弃卷积和自注意力且完全使用多层感知机(MLP)的视觉网络架构,在ImageNet数据集上实现了媲美CNN和ViT的性能表现;清华大学图形学实验室Jittor团队提出了一种新的注意机制,通过控制记忆单元的大小,External-attention可以轻松实现线性的复杂度等研究。目录:MLP-Mixer:Anall-MLPArchitectureforVisionBeyondSelf-attention:ExternalAttentionusingTwoLinearLayersforVisualTasksLearningSkeletalArticulationswithNeuralBlendShapesASurveyofModernDeepLearningbasedObjectDetectionModelsTotalRelighting:LearningtoRelightPortraitsforBackgroundReplacementGraphLea
我们写过很多ping问题的解决方法文章,但是最近我们发现之前用的桥接模式太复杂:需要开发板,Windows,ubuntu三者都ping通,步骤太多,很繁琐。最近我们研究出VMware设置成NAT模式,然后进行端口映射,只要开发板和windows能一边ping通(比如开发板能PINGWindows或windows能PING开发板),开发板就能挂载ubuntu的文件,是怎么做到的呢?下面将系统讲解…Windows下有很多虚拟机软件,目前市面上流行的有VMware和VirtualBox。VMware分为收费专业版WorkstationPro和非商用免费版WorkstationPlayer,推荐使用WorkstationPlayer。首先从VMware官网(http://www.vmware.com)下载WorkstationPlayer安装包,或者使用我们提供的安装包。在“网盘BSP包\01_Tools(工具)\01_Tools.zip”中。VMWare安装软件是:VMware-workstation-full-15.1.0-13591040.exe。安装方法见下图: VMWare安装完成后
说明 为了是通信安全,修改Android和单片机程序,以SSL的方式连接MQTT 程序说明(Android) 1.程序在以前的基础上做了些修改,详细修改如下: 2.端口号改为8883 (域名,用户名,密码根据自己的修改) <ignore_js_op> 3.增加代码如下 <ignore_js_op> ①证书验证回调(直接返回true) ②开启SSL 4.连接方式修改为:SSL <ignore_js_op> 修改说明(单片机) 1.提示 <ignore_js_op> 连接指令: "AT+CIPSTART=\"SSL\",\"%s\",%s\r\n",IP,Por使用上面的AT+CIPSTART指令连接TCP以后发送和接收数据是如下方式 1.发送数据,假设发送66个数据 1.1首先发送AT+CIPSEND=66\r\n 66:为要发送的数据个数 1.2等待模块返回> 1.3发送要发送的数据给模块 1.4模块返回Recv66bytes 1
ansible的安装有很多方式,这里以Mac为例安装brewinstallansible 他会顺便安装依赖python3 打ansible--version➜ansible--version ansible2.7.1 configfile=/Users/mafei/.ansible.cfg configuredmodulesearchpath=['/Users/mafei/.ansible/plugins/modules','/usr/share/ansible/plugins/modules'] ansiblepythonmodulelocation=/usr/local/Cellar/ansible/2.7.1/libexec/lib/python3.7/site-packages/ansible executablelocation=/usr/local/bin/ansible pythonversion=3.7.1(default,Nov62018,18:46:03)[Clang10.0.0(clang-1000.11.45.5)]复制创
在人工智能芯片领域,国内有寒武纪、星光智能一号,国外有IBM真北、谷歌TPU、英伟达,近日微软也加入了这个行列。作者|郭敏网址|http://www.datayuan.cn/微信公众号ID|datayuancn照顾我们、娱乐我们、为我们赚钱,这是未来AI(人工智能)要做的事。在医疗方面,通过对医学知识进行系统的学习,AI可以模拟诊断思维,辅助医生对患者进行诊疗;在生产制造方面,AI通过对产品数据、生产设备数据的收集、分析,智能化诊断产品的优良。AI不仅使医疗、制造等现有行业运行更加高效,而且未来像增强现实护目镜、机器人出租车等新兴行业也将成为可能。在现阶段,人们对AI的关注点主要集中在“人工智能如何利用算法击败人类”,对如何构建新型计算机芯片似乎不怎么感兴趣,要知道数据的收集、分析和传输都离不开芯片。在人工智能芯片领域,国内有寒武纪、星光智能一号,国外有IBM真北、谷歌TPU、英伟达,近日微软也加入了这个行列。日前,微软公布了人工智能芯片制造计划。在夏威夷举行的计算机视觉会议上,微软技术与研发部门主管HarryShum展示了一款新芯片,并表示这款芯片是现在Hololens处理器的升级版
随着将近25万人一起涌向一座六十万人口的城市,CES2018成为了现代社会现状的完美比喻。以超前的技术,不受洪水、停电和交通问题的困扰。上周在拉斯维加斯会议中心的国际消费电子展上,拥挤的人群、嘈杂的笑闹都在迎接着社交机器人、无人驾驶汽车、人工智能时代的到来。就像去年的CES故事一样,社交机器人今年到处都是,把展厅变成了类似迪士尼的机器人节。机器人的应用范围从移动机场机器人到广告机器人,到零售服务机器人,再到家用陪伴机器人。法国新贵BlueFrogRobotics的Buddy机器人脱颖而出,让成千上万的参观者惊喜不已。在采访BlueFrog创始人RodolpheHasselvander,他向我们描述了他对Buddy的期待,与一个冰冷的语音助手相比,Buddy更接近家庭宠物,在他看来,Buddy更像一只金毛猎犬,而不是轮在上的iPad。它非常可爱,闪烁的大眼睛瞬间就吸引了用户的眼球,形成了类似人类与机器人宠物的紧密关系。Hasselvander展示了Buddy如何执行一些独特的任务,包括:在家庭周边巡逻以查看可疑活动;在厨房里看食谱;为自己动手的项目提供指导;给孩子讲故事;甚至提醒奶奶吃药
开发同学前几天给我提了一个数据查询的需求,大体是查询某个表的数据,然后把查询结果以csv的形式提供给他们,一般来说这种定制查询,开发的同学都会提供好语句,DBA同学只需要简单执行即可。 每次看到语句,我都要简单评估一下,今天的语句看起来非常简单,需要在一个历史库中进行数据查取,从开发同学提供的语句来看,这个查询看起来真不简单。提供的数据都是近5年内的历史数据,所以我简单看了下,这个表有10亿的记录,而符合条件的数据就有1亿多条。从数据量来看,这个我是真没法提供了,数据结果集就肯定几十上百G了,发给开发同学肯定不现实的,而且就算这个坎能迈过去,他们也没法用啊,一个几十G的文件,本地几十M的文件excel打开都成问题,何况这么大的数据量。 所以找到开发同学,想了解一下他们要拿这么多数据干嘛,需求的情况是怎么样的,简单聊了下,发现原来是数据仓库组的同事需要做大数据分析,发现以前的部分数据存在问题,所以希望DBA能够提供一些帮助,把存在问题的历史数据提供给他们,重新更新一下,所以按照这种情况,这个需求看起来似乎也是合理的了。大数据所需,DBA提供基础数据。 所以一个很明显的问题摆在我面前,那就
虽然Docker官方提供了DockerHub作为公共的Registry服务器,给到用户进行镜像的保存和管理工作。但对于企业而言,考虑到安全性和网络效率等原因,通常会搭建私有的Registry服务器,用于提供企业内部的镜像仓库服务。本文将基于开源的Harbor项目来介绍关于私有仓库的搭建。一.Harbor介绍Harbor是由VMware公司中国团队开发的一个企业级Registry项目,可用于搭建企业内部的容器镜像仓库。Harbor在DockerRegistry的基础上增加了企业用户所需的权限控制、安全漏洞扫描、日志审核和远程复制等重要功能,还提供了图形管理界面及面向国内用户的中文支持,开源后便迅速业内流行开来,成为中国云原生用户的主流容器镜像仓库。2018年7月,Harbor正式进入CNCF(谷歌创办的云原生基金会,旗下项目包括Kubernetes、Prometheus等世界级产品),并在2020年6月顺利毕业,成为了CNCF首个来自中国的开源项目。Harbor的架构如下图所示,其中Coreservices为Harbor的核心模块,主要包括UI、token和webhook三个组件。UI提
前端性能监控(RealUserMonitoring,RUM)是一站式前端监控解决方案,专注于Web和小程序等大前端领域,主要关注用户页面性能(页面测速、接口测速、CDN测速等)和质量(JS错误、Ajax错误等),并且联动腾讯云应用性能观测实现前后端一体化监控。用户只需要安装SDK到自己的项目中,通过简单配置化,即可实现对用户页面质量的全方位守护,真正做到了低成本使用和无侵入监控。 产品优势多平台前端性能监控目前支持Web、Hippy、小程序(微信、QQ)和ReactNative等平台的数据上报,支持无打点首屏测速、资源测速、API测速、白名单机制和离线日志等功能特性。 无侵入前端性能监控SDK无需在业务代码中打点或者做任何其他操作,可以做到与业务代码充分解耦。SDK将会自动监控前端错误,在错误发生时上报错误的具体情况,帮助您快速定位问题。当您开启资源测速时,SDK将会自动监听页面资源加载情况(耗费时长、成功率等),并在不影响前端性能的前提下收集前端的性能数据,帮助您快速定位性能短板,提升用户体验。 低成本前端性能监控支持Web和小程序的前端真实体验监控服务,学习成本较低,只要您有过基础
引言 一个数据集合的中值(Median)通常是很一个很有价值的统计指标,由于它对异常数据不敏感,所以一般会比平均值(Mean)更能体现数据集合数据的“平均水平”。然而,对于无序数据序列求中值在实现上却没有求平均值那样简单优美的O(N)复杂度的算法。最容易想到的做法是先对数据进行排序,然后取中点的值,然而这种做法的时间复杂度是O(NlogN)。有没有更快的算法呢? 本文介绍两种更快的算法:第一种是利用快速排序原理的准确的随机选择算法;第二种是一种近似算法,所获得的值虽然可能不是很精确,但一般会比第一种方法更快。 本报告的算法实现伪代码除注释部分外均引自参考文献,若只需理解实现思想,不需要钻研伪代码的细节,可先直接看正文与注释部分。本报告提供了这两种算法相对先排序后取中值算法的时间性能比较的实验结果。 随机选择算法 这一算法是一个通用的选择算法,它可以求一个可排序数据序列中第k个位置的值。其算法伪代码如下: // 分割,即一般快排的分割方法,返回分割点 PARTITION(A,p,r) x ß A[r] &nbs
题目地址 https://atcoder.jp/contests/abc146/tasks 感觉没有什么有意思的题... 题解 A #include<bits/stdc++.h> usingnamespacestd; strings; intmain(){ cin>>s;intnow=0; if(s[0]=='S'){ if(s[1]=='U')now=0; elsenow=6; } if(s[0]=='M')now=1; if(s[0]=='T'){ if(s[1]=='U')now=2; elsenow=4; } if(s[0]=='W')now=3; if(s[0]=='F')now=5; printf("%d\n",7-now); } 复制 B #include<bits/stdc++.h> usingnamespacestd; chars[10000]; intmain(){ intn;cin>>n; scanf("%s",s); intlen=strlen(s); for(i
1.使用sed获取/etc/passwd文件第一列和第7列。 sed-n"1,5s#:.*:##gp"/etc/passwd sed-nr'1,5s#(.*):x.*:(.*)#\1\2#gp'/etc/passwd 复制 2.使用sed获取/etc/passwd文件前5行的最后一个字符。 sed-n"1,5s#.*\(.\)#\1#p"/etc/passwd sed-nr'1,5s#(.)#\1#gp'/etc/passwd|awk'{print$NF}' foriin$(head-5/etc/passwd|rev);doecho$i|head-c1;echo;done head-5/etc/passwd|rev|whilereadline;doecho$line|head-c1;echo;done 复制 作者:房佳亮 邮箱:crushlinux@163.com 出处:http://www.cnblogs.com/crushlinux/ &nbs
Cocos3.x用了大量的C++11的东西,所以作为一个C++忠实粉丝,有必要对C++11进行一个系统的学习。 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译器并不是完全支持,比如我正在使用的vs2012。这里是msdn里面VS各版本对C++11的支持 对C++11功能的支持(现代C++) 1.auto auto这个关键字C++原先就有,用来指定存储器。因为很少有人去用这个东西,所以在C++11中就把原有的auto功能给废弃掉了,而变成了现在的类型推导关键字。先说下auto的简单用法: #include<iostream> #include<vector> #include<map> usingnamespacestd; intmain(){ autonum=1;//num是int类型 autoc='A';//c是char类型 autostr("test");//str是char数组 map<string,vector<int>>map; for(autoit=be
在给服务器传值时form利用$.post( "/member/member/book/"+event_id, { tickets:tickets, csrf_ppw_token:csrf_ppw_token, event_id:event_id, },可以将tickets传值一个对象数组。浏览器caputure是tickets[0][fullname]:atickets[0][telephone]:tickets[0][email]:tickets[0][company]:tickets[0][role]:tickets[0][cat_id]:1tickets[1][fullname]:btickets[1][telephone]:tickets[1][email]:tickets[1][company]:tickets[1][role]:tickets[1][cat_id]:1csrf_ppw_token:575b56d0fa9aba282a0f0e4e8dc14c86event_id:1在服务器端也能利用_post["tickets"]拿到这个数
1、Applet程序组件 1.1.定义: Applet是采用Java编程语言编写的小应用程序,该程序可以包含在HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同。含有Applet的网页的HTML文件代码中部带有<applet>和</applet>这样一对标记,当支持Java的网络浏览器遇到这对标记时,就将下载相应的小应用程序代码并在本地计算机上执行该Applet。 1.2.工作原理及优势: 1.2.1 JavaApplet可以大大提高Web页面的交互能力和动态执行能力。Applet以代码的形式嵌入Web页面中,用标签<applet></applet>标明,当支持Java的网络浏览器遇到这对标记时,就下载相应的应用程序代码,并在本地计算机上执行Applet。Applet是一种Java的小 程序,它通过使用该Applet的HTML文件,由支持Java的网络浏览器下载运行。也可以通过java开发工具的appletviewer来运行。Applet程序离不开使用它的HTML文件。 1.2.2&
初始化项目 这里我们通过@vue/cli拉取简单配置的模板来初始化一个2.X的项目 vueinitwebpack-simplevue-test复制 初始化的项目目录如下 ├──README.md ├──index.html ├──package-lock.json ├──package.json ├──src │├──App.vue │├──assets │└──main.js └──webpack.config.js复制 接下来做一些改动。src目录下新增components用于存放组件,新增一个index.js用于导入组件进行注册,再导出 ├──README.md ├──index.html ├──package-lock.json ├──package.json ├──src │├──App.vue │├──assets │├──components │├──index.js │└──main.js └──webpack.config.js复制 在webpack.config.js同时修改entry及output,若想区分dev与build,在此处就不在写例子了 e
20162316刘诚昊2017-2018-2《Java程序设计》课下排序测试 实验要求 1给定下列数据:90875612323591653 用JDB或IDEA单步跟踪下列算法的执行过程:选择排序,插入排序,希尔排序,冒泡排序,快速排序,归并排序 2提交每一趟的截图,要全屏,包含自己的学号信息 3课下把代码推送到代码托管平台 过程: 1.载入书上的代码“Sorting”: publicclassSorting{ //---------------------------------------------------------------------------- //Sortsthespecifiedarrayofintegersusingtheselection //sortalgorithm //---------------------------------------------------------------------------- publicstaticvoidselectionSort(Comparable[]data){ intmin; for(intin
自PHP5.4.0起,PHP实现了一种代码复用的方法,称为trait。 Trait是为类似PHP的单继承语言而准备的一种代码复用机制。Trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method。Trait和Class组合的语义定义了一种减少复杂性的方式,避免传统多继承和Mixin类相关典型问题。 Trait和Class相似,但仅仅旨在用细粒度和一致的方式来组合功能。无法通过trait自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个Class之间不需要继承。 从基类继承的成员会被trait插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了trait的方法,而trait则覆盖了被继承的方法。 以下为代码: traittraitTestOne{ publicfunctiontest(){ echo"Thisistraitone<br/>"; } publicfunctiontestOne(){ echo"one<br/>"; } } traittraitTestTwo{ // public
使用Xcode6.1SVN出现问题 Theoperationcouldn’tbecompleted.(NSURLErrorDomainerror-1012.) 解决方法: 打开终端然后输入如下命令 svnlsxxxx (xxx是你SVNServer的地址) 这里询问你是否允许这个地址的访问,我们输入“p”,然后回车即可。 验证是否OK的方法: 再次控制台输入 svnlsxxxx 当不再提示让你选择是否允许的提示,而是直接控制台出现如下信息,说明OK了 作者:OlarTan 出处:http://www.cnblogs.com/olartan ♪:没有做不到的只有偷懒而错过的♪ 分享|
//爱心<script>!function(e,t,a){functionn(){c(".heart{width:10px;height:10px;position:fixed;background:#f00;transform:rotate(45deg);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);}.heart:after,.heart:before{content:'';width:inherit;height:inherit;background:inherit;border-radius:50%;-webkit-border-radius:50%;-moz-border-radius:50%;position:fixed;}.heart:after{top:-5px;}.heart:before{left:-5px;}"),o(),r()}functionr(){for(vare=0;e<d.length;e++)d[e].alpha<=0?(t.body.removeChi