【题目】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=1000010;
int ans[maxn],n;
char s[maxn];
int a[maxn],b[maxn],c[maxn],d[maxn];
const int MOD1=993258975,MOD2=934384734,base1=233,base2=197;
bool check(int l,int r,int L,int R){int x=r-l+1;//
    int ans1=(a[r]-1ll*a[l-1]*c[x]%MOD1+MOD1)%MOD1;int ans2=(a[R]-1ll*a[L-1]*c[x]%MOD1+MOD1)%MOD1;if(ans1!=ans2)return 0;ans1=(b[r]-1ll*b[l-1]*d[x]%MOD2+MOD2)%MOD2;ans2=(b[R]-1ll*b[L-1]*d[x]%MOD2+MOD2)%MOD2;if(ans1!=ans2)return 0;return 1;
}
int main(){scanf("%d%s",&n,s+1);c[0]=d[0]=1;for(int i=1;i<=n;i++)a[i]=(1ll*a[i-1]*base1+s[i])%MOD1,b[i]=(1ll*b[i-1]*base2+s[i])%MOD2;for(int i=1;i<=n;i++)c[i]=1ll*c[i-1]*base1%MOD1,d[i]=1ll*d[i-1]*base2%MOD2;memset(ans,-1,sizeof(ans));for(int i=1;i<=n/2;i++){int l=1,r=i+1,mid;while(l<r){mid=(l+r)>>1;if(check(i-mid+1,i+mid-1,n-i+1-mid+1,n-i+1+mid-1))l=mid+1;else r=mid;}l--;ans[i-l+1]=max(ans[i-l+1],2*l-1);}for(int i=1;i<=n/2;i++){ans[i]=max(ans[i],ans[i-1]-2);printf("%d ",ans[i]);}if(n&1)printf("-1");return 0;
}

View Code

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

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

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

转载于:https://www.cnblogs.com/onioncyc/p/8823892.html

【CodeForces】961 F. k-substrings 字符串哈希+二分相关推荐

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

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

  2. 【Codeforces 1426 F】Number of Subsequences,字符串计数DP

    problem F. Number of Subsequences time limit per test1 second memory limit per test256 megabytes inp ...

  3. 【CodeForces - 155C】Hometask (字符串,思维,贪心,熟悉句式)(总结)

    题干: Sergey attends lessons of the N-ish language. Each lesson he receives a hometask. This time the ...

  4. DNA序列 LOJ NOIP模拟赛 D1T1 字符串哈希

    字符串哈希 上代码 #include<cstdio> #include<cstring> #include<string> #include<iostream ...

  5. Hash(哈希(字符串哈希))模板和做题总结(详细易懂)

    文章目录 目录 文章目录 前言: 一 Hash表 1 Hash函数的构造 2 拉链法处理hash冲突模板 3 开放寻址法处理hash冲突 4(例题).雪花雪花 二   字符串Hash O(n)+O(m ...

  6. CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换,清晰易懂)

    CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换)   首先一共有四个操作,第一个和第四个都是线段树的基本操作,直接用线段树实现.      第 ...

  7. 中石油训练赛 - DNA(字符串哈希)

    题目链接:点击查看 题目大意:给出一串只由A,C,G,T组成的字符串,再给出一个数字k,问每个长度为k的连续子串,出现的次数最多是多少次 题目分析:O(n)哈希一下,O(n)更新一下用无序map维护的 ...

  8. HDU - 3613 Best Reward(字符串哈希)

    题目链接:点击查看 题目大意:给出一个字符串,每个字母都有一个贡献值,现在要将这个字符串拆成两个子串,如果子串是回文串的话,贡献就是其中每个字母的贡献和,现在问贡献最大为多少 题目分析:很简单的一道回 ...

  9. [Leetcode][程序员面试金典][面试题17.13][JAVA][恢复空格][动态规划][Trie][字符串哈希]

    [问题描述][中等] [解答思路] 1. 动态规划 动态规划流程 第 1 步:设计状态 dp[i] 表示字符串的前 i 个字符的最少未匹配数. 第 2 步:状态转移方程 假设当前我们已经考虑完了前 i ...

最新文章

  1. 报名 | 图灵奖得主John Hopcroft做客清华,与你畅谈信息革命!
  2. 算法导论 第六章 堆排序 习题6.5-8 k路合并排序
  3. Git log高级用法
  4. 多线程pthread_join()的作用
  5. Hadoop 2.x 完全分布式HA集群环境搭建
  6. python倒三角形粉色填充笔的形状海龟_Python001-Turtle(海龟绘图)详解
  7. 如何利用Serilog的RequestLogging来精简ASP.NET Core的日志输出
  8. 免费下载 80多种的微软推出入门级 .NET视频
  9. 案例分析 | 由Decimal操作计算引发的Spark数据丢失问题
  10. js 添加事件 attachEvent 和addEventListener 的用法
  11. SQL优化之存储过程强制编译
  12. python考试题目及答案-python面试真实笔试题,带答案(1-10题)
  13. IDEA Gradle的配置
  14. 关于EasyUI中DataGrid控件的一些使用方法总结
  15. EF学习笔记-2 EF之支持复杂类型的实现
  16. python aiml开发文档_Python AIML搭建聊天机器人
  17. x99 芯片服务器,X99果然是支持PCI-E拆分的啊
  18. 2018.7.18 上半年课程总结 4- 高级英语
  19. mysql插入数据的时候出错_毕设问题小记——Mysql插入数据时出错
  20. 前端项目总结:客运互联网售票平台

热门文章

  1. 我是如何利用“王宝强离婚”事件来吸粉的
  2. 对代理ARP技术的误读、无法完成代理ARP实验的故障分析
  3. 建立可扩展的silverlight应用框架 step-7 final
  4. 简单的利用IDEA搭建SpringBoot+Maven+Mybatis+自动生成代码
  5. 架构模式:MVC与MVVM
  6. UML 建模大佬养成记(Java版)
  7. 系统集成项目管理工程师教程(第2版)带书签目录
  8. Streaming源码解读之接收流数据的全生命周期
  9. MyEclipse+Tomcat部署发布webapp
  10. MPEG简介 + 如何计算CBR 和VBR的MP3的播放时间