题意:给你一个字符串(sl<=1e6),问每一个起点到1和终点到sl距离相等的子串的最长不等于串长的border。

标程:

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int can=;
const int mod=;
const int N=;
int ha[N],pow[N],n,ans[N],l,r,len,cnt;
char s[N];
int S(int x,int l)
{return ((ll)ha[x+l-]-(ll)ha[x-]*pow[l]%mod+mod)%mod;}
int main()
{
scanf("%d%s",&n,s+);
pow[]=;
for (int i=;i<=n;i++) pow[i]=(ll)pow[i-]*can%mod;
for (int i=;i<=n;i++) ha[i]=((ll)ha[i-]*can%mod+(s[i]-'a'+))%mod;
if (n&) l=r=n/+;else l=n/,r=l+;len=;
while (r<=n)
{
while (len!=-&&S(l,len)!=S(r-len+,len)||len>=r-l+) len-=;
ans[++cnt]=len;
l--,r++; len+=;
}
for (int i=cnt;i>=;i--) printf("%d ",ans[i]);
return ;
}

题解:hash+单调性

对于每一个串二分+hash?这样的答案并没有单调性。

但是(分析数据)经过有理有据的推导,发现所有这样的串的答案是具有单调性的。

对于一个串,如果在它的两边各加一个字符,那么它的border长度最多+2。

证明:

比如现在完成一个串A....B(A,B都是字符块,并且为该串的最长border)

左右各扩展:xA....By

可以证明最优情况下的匹配是xAz...gBy,不会出现xAC...DBy(C,D是长度>1的字符块)

如果存在xAC=DBy.那么提取C的最后一个字母=y,D的第一个字母=x,即xACy=xDBy。

所以AC=DB,不满足A,B是最长border。

然后就直接hash比较即可。

时间复杂度O(n)。

CF961F k-substring的更多相关文章

  1. hdu 5677 ztr loves substring 多重背包

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...

  2. [HDU5677]ztr loves substring

    ztr loves substring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  3. HDU 5677 ztr loves substring(回文串加多重背包)

    ztr loves substring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  4. 年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)

    WPF中Style的使用 Styel在英文中解释为”样式“,在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外观更加美化同时减少了 ...

  5. 昆仑游戏[JS加密修改]

    昆仑游戏:http://www.kunlun.com/index.html JS加密修改 BigTools=window.BigTools;//重点 RSAKeyPair=window.RSAKeyP ...

  6. BUG-FREE-For Dream

    一直直到bug-free.不能错任何一点. 思路不清晰:刷两天. 做错了,刷一天. 直到bug-free.高亮,标红. 185,OA(YAMAXUN)--- (1) findFirstDuplicat ...

  7. C#几个经常用到的字符串截取

    C#几个经常用到的字符串截取 一. 1.取字符串的前i个字符 (1)string str1=str.Substring(0,i); (2)string str1=str.Remove(i,str.Le ...

  8. d3-画雷达图-圆形弧线

    本文转载 终极效果 源码 index.html <!DOCTYPE html> <html> <head> <meta http-equiv="Co ...

  9. 生成n位随机字符串

    --1.借助newid() Go --创建视图(因为在函数中无法直接使用newid()) create view vnewid as select newid() N'MacoId'; go --创建 ...

  10. 我要崩溃了,要解出这么一段js代码背后的东西,这真是一坨啊,别被高度欺骗了,他还有宽度!!!!!试着按下方向右键

    一坨js代码: function s_gi(un, pg, ss) { var c = "s.version='H.26';s.an=s_an;s.logDebug=function(m){ ...

随机推荐

  1. 让nginx支持patchinfo,(支持codeigniter,thinkphp,ZF等框架)

    nginx 的config配置: server { listen ; server_name xxx; ....if (!-e $request_filename) { rewrite ^/(.*)$ ...

  2. 数据结构C++版-队列

    一.概念 分类: 二.补充说明 1.<面向对象的队列设计>课程问答: 首先要明确数据结构和数据存储结构的概念. 数据结构是指数据对象之间的逻辑关系,例如二叉树,队列,栈等,而数据存储结构是 ...

  3. VS2010-MFC(Ribbon界面开发:为Ribbon Bar添加控件)

    转自:http://www.jizhuomi.com/software/253.html 前面一节为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节教程就来初步讲讲怎样为Ribbon Bar ...

  4. Spring源码由浅入深系列四 创建BeanFactory

    继上一章refresh之后,上图描述了obtainFreshBeanFactory过程.

  5. mybatis 处理枚举类型

    MyBatis支持持久化enum类型属性.假设t_user表中有一列gender(性别)类型为 varchar2(10),存储 MALE 或者 FEMALE 两种值.并且,User对象有一个enum类 ...

  6. drools原生drl规则文件的使用

    在初识drools中对drl文件进行了简单的介绍.这里举个例子来具体说明下.主要是写了规则之后我们如何用java代码来run起来. drl文件内容如下: rule "ageUp12" ...

  7. spring MVC 转发与重定向(传参)

    return "forward:index.jsp"; //转发  return "forward:user.do?method=reg5"; //转发 ret ...

  8. 2019-6-23-win10-uwp-开发-CSDN-访问量统计-源代码

    title author date CreateTime categories win10 uwp 开发 CSDN 访问量统计 源代码 lindexi 2019-6-23 11:2:1 +0800 2 ...

  9. ASP.NET打开项目错误:将指定的计数添加到该信号量中会导致其超过最大计数。

    1.错误如图 2.解决方案 重启IIS即可,运行-> 输入IISRESET 命令 即可重启IIS,如图

  10. python库之sklearn

     一.安装sklearn conda install scikit-learn 参考文献 [1]整体介绍sklearn https://blog.csdn.net/u014248127/article ...