【题目】F. k-substrings

【题意】给定长度为n的串S,对于S的每个k-子串$s_ks_{k+1}...s_{n-k+1},k\in[1,\left \lceil \frac{n}{2} \right \rceil]$,找到满足[奇数长度][严格子串][同时是前缀和后缀]的最长子串。n<=10^6。

【算法】字符串哈希+二分

【题解】任意两个对应子串,它们有一个不变量——它们的中心一定是i和n-i+1。而且固定中心之后,能延伸的最长相等子串是可以二分+哈希得到的。

所以枚举k,二分+哈希处理出以k为中心和对应串相等的最长子串半长L。

然后实际上是一个递减序列覆盖求单点最值的问题,有一个巧妙的解决方法,在k-L+1处标记答案,然后从前往后扫描每次和ans[i]=max{ans[i],ans[i-1]-2}。因为这是一个从大到小的递减序列,所以就不需要考虑终止,因为<0就自然没有意义了。

复杂度O(n log n)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
int ans[maxn],n;
char s[maxn];
int a[maxn],b[maxn],c[maxn],d[maxn];
const int MOD1=,MOD2=,base1=,base2=;
bool check(int l,int r,int L,int R){
int x=r-l+;//
int ans1=(a[r]-1ll*a[l-]*c[x]%MOD1+MOD1)%MOD1;
int ans2=(a[R]-1ll*a[L-]*c[x]%MOD1+MOD1)%MOD1;
if(ans1!=ans2)return ;
ans1=(b[r]-1ll*b[l-]*d[x]%MOD2+MOD2)%MOD2;
ans2=(b[R]-1ll*b[L-]*d[x]%MOD2+MOD2)%MOD2;
if(ans1!=ans2)return ;
return ;
}
int main(){
scanf("%d%s",&n,s+);c[]=d[]=;
for(int i=;i<=n;i++)a[i]=(1ll*a[i-]*base1+s[i])%MOD1,b[i]=(1ll*b[i-]*base2+s[i])%MOD2;
for(int i=;i<=n;i++)c[i]=1ll*c[i-]*base1%MOD1,d[i]=1ll*d[i-]*base2%MOD2;
memset(ans,-,sizeof(ans));
for(int i=;i<=n/;i++){
int l=,r=i+,mid;
while(l<r){
mid=(l+r)>>;
if(check(i-mid+,i+mid-,n-i+-mid+,n-i++mid-))l=mid+;else r=mid;
}
l--;
ans[i-l+]=max(ans[i-l+],*l-);
}
for(int i=;i<=n/;i++){
ans[i]=max(ans[i],ans[i-]-);
printf("%d ",ans[i]);
}
if(n&)printf("-1");
return ;
}

字符串哈希:将字符串换算成base进制的数字取模接近int的素模数,比较两段字符串时判断a[r]-a[l-1]*base^(r-l+1)是否相等即可。当然需要双哈希。

如果是建哈希表,就建一条链存真实值。(参考插头DP)

顺便提一下朴素KMP处理一次询问的方法:整个字符串跑出fail数组,那么从n一直fail到最小的>0的位置就是最小首尾匹配串了。KMP的fail树十分强大。

【CodeForces】961 F. k-substrings 字符串哈希+二分的更多相关文章

  1. Codeforces Gym 100338B Spam Filter 字符串哈希+贝叶斯公式

    原题链接:http://codeforces.com/gym/100338/attachments/download/2136/20062007-winter-petrozavodsk-camp-an ...

  2. 【题解】 Codeforces Edu41 F. k-substrings (字符串Hash)

    题面戳我 Solution 我们正着每次都要枚举从长到短,时间复杂度承受不了,但是我们可以发现一个规律,假设某次的答案为\(x\),那么这个字符串为\(A+X+B\)组成,无论中间的\(X\)是重叠还 ...

  3. codeforces gym 101164 K Cutting 字符串hash

    题意:给你两个字符串a,b,不区分大小写,将b分成三段,重新拼接,问是否能得到A: 思路:暴力枚举两个断点,然后check的时候需要字符串hash,O(1)复杂度N*N: 题目链接:传送门 #prag ...

  4. Codeforces Round #543 (Div. 2) F dp + 二分 + 字符串哈希

    https://codeforces.com/contest/1121/problem/F 题意 给你一个有n(<=5000)个字符的串,有两种压缩字符的方法: 1. 压缩单一字符,代价为a 2 ...

  5. CF1056E Check Transcription 字符串哈希

    传送门 暴力枚举\(0\)的长度,如果对应的\(1\)的长度也是一个整数就去check是否合法.check使用字符串哈希. 复杂度看起来是\(O(st)\)的,但是因为\(01\)两个数中数量较多的至 ...

  6. HASH 字符串哈希 映射转化

    哈希HASH的本质思想类似于映射.离散化. 哈希,通过给不同字符赋不同的值.并且钦定一个进制K和模数,从而实现一个字符串到一个模意义下的K进制数上. 它的主要目的是判重,用于$DFS$.$BFS$判重 ...

  7. 从Hash Killer I、II、III论字符串哈希

    首先,Hash Killer I.II.III是BZOJ上面三道很经典的字符串哈希破解题.当时关于II,本人还琢磨了好久,但一直不明白为啥别人AC的代码都才0.3kb左右,直到CYG神犇说可以直接随机 ...

  8. 【NOIP模拟】Grid(字符串哈希)

    题目背景 SOURCE:NOIP2016-RZZ-1 T3 题目描述 有一个 2×N 的矩阵,矩阵的每个位置上都是一个英文小写字符. 现在需要从某一个位置开始,每次可以移动到一个没有到过的相邻位置,即 ...

  9. 洛谷 P3370 字符串哈希 (模板)

    <题目链接> <转载于 >>>  > 题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共 ...

随机推荐

  1. PAT 甲级 1126 Eulerian Path

    https://pintia.cn/problem-sets/994805342720868352/problems/994805349851185152 In graph theory, an Eu ...

  2. Read N Characters Given Read4

    The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...

  3. maven执行"mvn clean package" 命令报错

    昨天利用mvn打包,执行程序'mvn clean package' 命令,发现打包失败 问题描述 具体看代码 发信tomcat下的log 清除不掉.为什么呢?忽然想起来我的项目服务还起着,于是我把服务 ...

  4. js本地储存userData实例

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  5. UVAlive4255_Guess

    题目很好很有意思. 告诉你n个序列中,任意一个连续子序列的和与0相比较的结果. 构造一个满足条件的序列. 对于从x->y这一段的和,如果大于0,那么sum[x]>sum[y-1],显然我们 ...

  6. JVM类加载机制详解(二)类加载器与双亲委派模型

    在上一篇JVM类加载机制详解(一)JVM类加载过程中说到,类加载机制的第一个阶段加载做的工作有: 1.通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件).而获取的方式,可 ...

  7. 【刷题】BZOJ 2693 jzptab

    Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 1 4 5 Sa ...

  8. RocketMQ生产者消息篇

    系列文章 RocketMQ入门篇 RocketMQ生产者流程篇 RocketMQ生产者消息篇 前言 上文RocketMQ生产者流程篇中详细介绍了生产者发送消息的流程,本文将重点介绍发送消息的通信模式以 ...

  9. 【IOI 2018】Combo 组合动作(模拟,小技巧)

    题目链接 IOI的签到题感觉比NOI的签到题要简单啊,至少NOI同步赛我没有签到成功…… 其实这个题还是挺妙妙的,如果能够从题目出发,利用好限制,应该是可以想到的做法的. 接下来开始讲解具体的做法: ...

  10. bzoj 1406

    %%% PoPoQQQ x^2=kn+1 x^2-1=kn (x+1)(x-1)=kn 令x+1=k1*n1,x-1=k2*n2,其中k1k2=k,n1n2=n 因此我们可以枚举n的约数中所有大于等于 ...