Description:
You are given a string s consisting of n lowercase Latin letters.
Let’s denote k-substring of s as a string subsk = sksk + 1…sn + 1 - k. Obviously, subs1 = s, and there are exactly such substrings.
Let’s call some string t an odd proper suprefix of a string T iff the following conditions are met:
·|T| > |t|;
·|t| is an odd number;
·t is simultaneously a prefix and a suffix of T.
For evey k-substring () of s you have to calculate the maximum length of its odd proper suprefix.

Input:
The first line contains one integer n (2 ≤ n ≤ 106) — the length s.
The second line contains the string s consisting of n lowercase Latin letters.

Output:
Print integers. i-th of them should be equal to maximum length of an odd proper suprefix of i-substring of s (or  - 1, if there is no such string that is an odd proper suprefix of i-substring).

Sample Input:
15
bcabcabcabcabca
Sample Output:
9 7 5 3 1 -1 -1 -1

Sample Input:
24
abaaabaaaabaaabaaaabaaab
Sample Output:
15 13 11 9 7 5 3 1 1 -1 -1 1

Sample Input:
19
cabcabbcabcabbcabca
Sample Output:
5 3 1 -1 -1 1 1 -1 -1 -1

Note:
The answer for first sample test is folowing:
·1-substring: bcabcabcabcabca
·2-substring: cabcabcabcabc
·3-substring: abcabcabcab
·4-substring: bcabcabca
·5-substring: cabcabc
·6-substring: abcab
·7-substring: bca
·8-substring: c

题意:
给出一个长度为n的字符串s,输出(n+1)/2个数,每个数代表从字符串第k位开始到第n+k-1位的序列中,满足既是其前缀又是其后缀的子串的最大奇数长度,如果不存在就输出-1(注意本题要求前后缀不能重叠)。

解法:
仿佛一道玄学题。总而言之,我们的时间复杂度是O(n)。
首先我们要发现一个结论,ans[i]<=ans[i+1]+2,因为两个序列的长度差是2(别问我为什么要发现这个,我也没发现) 。
考虑倒着计算ans[i](也就是从中间开始向左右延伸),左右端点设置为l和r,前缀长度从ans[i+1]+2枚举到1,用hash判断是否相等,相等就保存答案,如果循环结束了ans[i]还是0,意味着不存在该前缀,那就把答案设置成-1。最后一并输出答案。
方法来源于https://www.luogu.com.cn/problemnew/solution/CF961F。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<stdlib.h>
#include<cstring>
using namespace std;int n,l,r;
int ans[1000000+5];
long long mmod=2333,mod=1e9+7;
long long shash[1000000+5],base[1000000+5];
char s[1000000+5];int main()
{scanf("%d%s",&n,s+1);base[0]=1;for(int i=1;i<=n;i++){shash[i]=(shash[i-1]*mmod+s[i]-'a'+1)%mod;base[i]=base[i-1]*mmod%mod;}if(n%2==1){ans[(n+1)/2]=-1;l=r=(n+1)/2;}else{l=n/2;r=n/2+1;if(s[l]==s[r])ans[n/2]=1;else ans[n/2]=-1;}for(int i=(n+1)/2-1;i>=1;i--){l--;r++;for(int j=ans[i+1]+2;j>=1;j-=2){long long a=(shash[l+j-1]-shash[l-1]*base[j]%mod+mod)%mod;long long b=(shash[r]-shash[r-j]*base[j]%mod+mod)%mod;if(a==b){ans[i]=j;break;}}if(ans[i]==0)ans[i]=-1;}for(int i=1;i<(n+1)/2;i++)printf("%d ",ans[i]);printf("%d",ans[(n+1)/2]);return 0;
}

CodeForces961F- k-substrings(哈希)相关推荐

  1. 布隆过滤器定义长度为m的数组,插入n个元素,k个哈希函数,已知m和n的值,k的值为多少时,求误判率最低的推导过程?

    布隆过滤器是怎么存储数据的? 这里m=11,数组长度为11,n=3,插入3个元素,分别是hello.how.yes,k=3,使用了3个哈希函数,每插入一个元素要经过三个哈希函数的运算. ①插入hell ...

  2. 【LeetCode笔记】560. 和为K的子数组(Java、前缀和、哈希表)

    文章目录 题目描述 思路 & 代码 暴力法 O(n2n^2n2) 前缀和 + 哈希表 O(n) 二刷 题目描述 第一道前缀和题目- 思路 & 代码 暴力法 O(n2n^2n2) 固定一 ...

  3. 学习超大神经网络,CPU超越V100 GPU,靠的居然是哈希?

    机器之心报道 机器之心编辑部 训练一亿参数量的全连接网络,44 核心 CPU 让 V100 甘拜下风,靠的居然是--哈希? 深度学习模型的训练和推理加速近来是研究领域关注的重点.虽然普遍观点认为,GP ...

  4. 哈希表(HashMap)分析及实现(JAVA)

    转自:http://www.java3z.com/cwbwebhome/article/article8/83560.html?id=4649 ---------------------------- ...

  5. 数据结构源码笔记(C语言):哈希表的相关运算算法

    //实现哈希表的相关运算算法 #include<stdio.h> #include<malloc.h> #include<string.h>#define MaxS ...

  6. A. Many Equal Substrings(自己很水)

    A. Many Equal Substrings You are given a string tt consisting of nn lowercase Latin letters and an i ...

  7. 局部敏感哈希-Locality Sensitive Hashing

    局部敏感哈希 转载请注明http://blog.csdn.net/stdcoutzyx/article/details/44456679  在检索技术中,索引一直需要研究的核心技术.当下,索引技术主要 ...

  8. 算法练习day12——190331(哈希函数、哈希表、布隆过滤器、一致性哈希)

    1.哈希函数 1.1 特点: 经典的哈希函数输入域是无穷大的. 输出域是有穷尽的: 相同输入得到的输出肯定是一样的: 不同的输入得到的输出也可能一样(输入域>输出域); 哈希函数的离散型:给定多 ...

  9. “玩转标签,发现层次的力量!”:跨模态哈希方法研究

    「论文访谈间」是由 PaperWeekly 和中国中文信息学会社会媒体处理专委会(SMP)联合发起的论文报道栏目,旨在让国内优质论文得到更多关注和认可. 论文动机 近年来,随着智能终端等多媒体设备的普 ...

  10. POJ - 2002 Squares 数正方形【二分】【哈希表】

    Squares POJ - 2002 题意 平面上有N个点,任取4个点,求能组成正方形的不同组合方式有多少种:相同的四个点,不同顺序构成的正方形视为同一正方形 分析 做法1 先枚举两个点,通过计算得到 ...

最新文章

  1. 图像分割(Image Segmentation)
  2. Go Web编程--深入学习解析HTTP请求
  3. 如何在VB6.0里动态使用具有事件的对象
  4. fastboot工具使用
  5. 移动通信(Mobile Communication)
  6. PCL计算点到直线距离
  7. MATLAB学习:解一阶常系数微分方程
  8. GOOGLE搜索局域网聊天软件局域网聊天软件
  9. 数学小故事之 柯西的故事
  10. ti-sdk-evm-am335x-05.07 uboot分析(MLO跳转到u-boot之前)
  11. 使用云服务器被攻击了怎么办
  12. Java8新特性之Optional类(附代码案例)
  13. 张艺谋的2008随笔
  14. IPV4服务器如何支持ipv6访问
  15. 发展数字经济具有重要意义
  16. 教您用几何画板画相切的圆
  17. Qt 画图工具擦除操作,恢复透明色
  18. 可达100K/月,美团招聘各类安全工程师(地点:北京/上海,内含大量岗位)
  19. 中小学青少年编程创意机器人相关技术等级考试资料(含下载链接)
  20. 实现斐波拉契的三种方法

热门文章

  1. 故障:安装OFFICE2007时,刚开始安装,就提示“windows installer 服务不能更新一个或多个受保护的windows文件”,然后安装回滚,最后退出安装。
  2. iOS 关于音频开发
  3. 【毕业设计系列】035:基于matlab的线性调频信号的仿真
  4. What is T abby? Interpretable Model Decisions by Learning Attribute-based Classification Criteria翻译*
  5. WWW 2018论文分享| 基于部分可见异常样本的异常检测问题
  6. 数字 IC 设计、FPGA 设计秋招笔试题目、答案、解析(5)2021 华为海思(下)
  7. 电动充气泵方案与充气泵芯片
  8. python类的使用的生物学应用_Python 类的使用
  9. RailWay免费容器托管平台
  10. Joggler的MeeGo系统移植