CF961F k-substring
题意:给你一个字符串(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的更多相关文章
- hdu 5677 ztr loves substring 多重背包
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...
- [HDU5677]ztr loves substring
ztr loves substring Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- HDU 5677 ztr loves substring(回文串加多重背包)
ztr loves substring Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- 年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)
WPF中Style的使用 Styel在英文中解释为”样式“,在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外观更加美化同时减少了 ...
- 昆仑游戏[JS加密修改]
昆仑游戏:http://www.kunlun.com/index.html JS加密修改 BigTools=window.BigTools;//重点 RSAKeyPair=window.RSAKeyP ...
- BUG-FREE-For Dream
一直直到bug-free.不能错任何一点. 思路不清晰:刷两天. 做错了,刷一天. 直到bug-free.高亮,标红. 185,OA(YAMAXUN)--- (1) findFirstDuplicat ...
- C#几个经常用到的字符串截取
C#几个经常用到的字符串截取 一. 1.取字符串的前i个字符 (1)string str1=str.Substring(0,i); (2)string str1=str.Remove(i,str.Le ...
- d3-画雷达图-圆形弧线
本文转载 终极效果 源码 index.html <!DOCTYPE html> <html> <head> <meta http-equiv="Co ...
- 生成n位随机字符串
--1.借助newid() Go --创建视图(因为在函数中无法直接使用newid()) create view vnewid as select newid() N'MacoId'; go --创建 ...
- 我要崩溃了,要解出这么一段js代码背后的东西,这真是一坨啊,别被高度欺骗了,他还有宽度!!!!!试着按下方向右键
一坨js代码: function s_gi(un, pg, ss) { var c = "s.version='H.26';s.an=s_an;s.logDebug=function(m){ ...
随机推荐
- (转)基于SAML的单点登录介绍
转:http://www.cnblogs.com/zsuxiong/archive/2011/11/19/2255497.html 一.背景知识: SAML即安全断言标记语言,英文全称是Securit ...
- c++ pb_ds库,实现 红黑树,Splay
C++ pb_ds库 #include <ext/pb_ds/assoc_container.hpp>#include <ext/pb_ds/tree_policy.hpp> ...
- hash值的计算与转换 分类: ACM TYPE 2015-05-07 17:49 36人阅读 评论(0) 收藏
#include <bits/stdc++.h> using namespace std; const int MAXN = 100; const int X = 3; long long ...
- 剑指offer——03替换空格
题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 注意事项: <剑指o ...
- bagging和boosting以及rand-forest
bagging: 让该学习算法训练多轮,每轮的训练集由从初始的训练集中随机取出的n个训练样本组成,某个初始训练样本在某轮训练集中可以出现多次或根本不出现,训练之后可得到一个预测函数序列h_1,⋯ ⋯h ...
- 创建一个学生表student,默认的表空间为users,字段自定,同时为表的各个字段分别添加合适的约束,然后测试约束的验证状态。
create table student(id number(4) constraint prim_key primary key,name varchar(8) not null,sex varch ...
- idea引入项目下所有文件(ps:包括静态文件夹)
打开项目的目录结构 点击finish 最后删除目录下多余的src就可以了
- 21-2-substring
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Docker学习のDocker和虚拟机
最初听到Docker,是作为虚拟机来宣传的,但是它本质不是虚拟机 一.虚拟机 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统. ...
- digitalpersona 开发
一 下载 sdk : https://codeload.github.com/iamonuwa/Digital-Persona-SDK/zip/master 二 解压后,安装SDK 三 找到安装目录( ...