Codeforces961F. k-substrings
$n \leq 1000000$的字符串,对每一个子串$i$~$n-i+1$,求他最长的一个既是前缀又是后缀的子串。
这题要求的东西具有“对称性”,不充分利用难以解决。这里的“对称性”不仅指询问是对称的,更指要求的那个公共部分是对称的——不对称的相同的子串对答案没有丝毫贡献。
从贡献的角度入手,就是求每个前缀$i$和后缀$n-i+1$的一个在前缀$i$的末尾的、在后缀$n-i+1$的开头的一个最长公共串。嗯那赶紧二分+哈希。额等等,从$i$向前延伸,从$n-i+1$向后延伸,字符串是否相同,这样一个函数不单调哦。但是,如果您从前缀$i$的中点处和后缀$n-i+1$的中点处向两边分别延伸,这样字符串是否相同就是一个单调函数了。
因此转移战线,枚举对称相同串的中间位置$i$,然后$i$和$n-i+1$分别向两边延伸看最长的相同串多长,用二分+哈希判断。假设这次二分的答案是$2x-1$,那么$ans_{i-x+1}$就会$max$上$2x-1$。但这个串对$i-x+1$到$i$处的答案都是有贡献的,并且贡献每次减2,为了体现这一点只需要最后统计答案时$ans_i \ \ =max(ans_i,ans_{i-1}-2)$即可。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//#include<queue>
//#include<vector>
#include<algorithm>
//#include<iostream>
//#include<assert.h>
using namespace std; int n;
#define maxn 2000011
char s[maxn]; int h1[maxn],h2[maxn],p1[maxn],p2[maxn],mod1=,mod2=;
int geth1(int L,int R) {return (h1[R]-h1[L-]*1ll*p1[R-L+]%mod1+mod1)%mod1;}
int geth2(int L,int R) {return (h2[R]-h2[L-]*1ll*p2[R-L+]%mod2+mod2)%mod2;} int ans[maxn];
int main()
{
scanf("%d%s",&n,s+);
h1[]=h2[]=;
for (int i=;i<=n;i++) h1[i]=(h1[i-]*27ll+s[i]-'a'+)%mod1,h2[i]=(h2[i-]*27ll+s[i]-'a'+)%mod2;
p1[]=p2[]=;
for (int i=;i<=n;i++) p1[i]=p1[i-]*27ll%mod1,p2[i]=p2[i-]*27ll%mod2; for (int i=;i<=(n+)>>;i++) ans[i]=-;
for (int i=;i<=n>>;i++)
{
int L=,R=i,p=n-i+;
while (L<R)
{
int mid=(L+R+)>>,a=i-mid+,b=i+mid-,c=p-mid+,d=p+mid-;
if (geth1(a,b)==geth1(c,d) && geth2(a,b)==geth2(c,d)) L=mid;
else R=mid-;
}
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]);
}
return ;
}
Codeforces961F. k-substrings的更多相关文章
- 【HDU 5030】Rabbit's String (二分+后缀数组)
Rabbit's String Problem Description Long long ago, there lived a lot of rabbits in the forest. One d ...
- hdu 5030 Rabbit's String(后缀数组&二分法)
Rabbit's String Time Limit: 40000/20000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- django模型操作
Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表
- 【POJ 3415】Common Substrings 长度不小于k的公共子串的个数
长度不小于k的公共子串的个数,论文里有题解,卡了一上午,因为sum没开long long!!! 没开long long毁一生again--- 以后应该早看POJ里的Discuss啊QAQ #inclu ...
- POJ-Common Substrings(后缀数组-长度不小于 k 的公共子串的个数)
题意: 长度不小于 k 的公共子串的个数 分析: 基本思路是计算 A 的所有后缀和 B 的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于 k 的部分全部加起来. 先将两个字符串连起来,中间 ...
- POJ 3415 Common Substrings(长度不小于K的公共子串的个数+后缀数组+height数组分组思想+单调栈)
http://poj.org/problem?id=3415 题意:求长度不小于K的公共子串的个数. 思路:好题!!!拉丁字母让我Wa了好久!!单调栈又让我理解了好久!!太弱啊!! 最简单的就是暴力枚 ...
- POJ 3415 Common Substrings 【长度不小于 K 的公共子串的个数】
传送门:http://poj.org/problem?id=3415 题意:给定两个串,求长度不小于 k 的公共子串的个数 解题思路: 常用技巧,通过在中间添加特殊标记符连接两个串,把两个串的问题转换 ...
- Common Substrings POJ - 3415(长度不小于k的公共子串的个数)
题意: 给定两个字符串A 和 B, 求长度不小于 k 的公共子串的个数(可以相同) 分两部分求和sa[i-1] > len1 sa[i] < len1 和 sa[i-1] < ...
- POJ - 3415 Common Substrings(后缀数组求长度不小于 k 的公共子串的个数+单调栈优化)
Description A substring of a string T is defined as: T( i, k)= TiTi+1... Ti+k-1, 1≤ i≤ i+k-1≤| T|. G ...
- CSU-1632 Repeated Substrings (后缀数组)
Description String analysis often arises in applications from biology and chemistry, such as the stu ...
随机推荐
- Linux OpenGL 实践篇-13-geometryshader
几何着色器 几何着色器是位于图元装配和片元着色器之前的一个着色器阶段,是一个可选阶段.它的输入是一个图元的完整的顶点信息,通常来自于顶点着色器,但如果细分计算着色器启用的话,那输入则是细分计算着色器的 ...
- CSS的相对定位和绝对定位
relative的意思就是相对自己的一开始的位置进行的定位.如图: 但是这个元素的本身边距不变,还在原来位置 absolute的意思就是 如果它的父元素设置了除static之外的定位,比如pos ...
- winform中让显示的图片覆盖到父窗体保持父窗体的不可选中的状态,且任务栏中不会显示子窗体的任务选项
要求:为父窗体添加一个类似于加载等待的功能,当窗体点击备份时弹出且覆盖掉窗体 问题一产生:当为弹窗添加控件时,form.show();导致窗体卡死,控件变得透明化; 问题一分析:当窗体show();之 ...
- ucosii(2.89)mutex 应用要点
mutex 的创建在于共享资源打交道是可以可以保证满足互斥条件:1,必须保证继承优先级要高于可能与相应共享资源打交道的任务中优先级最高的优先级.2,不要将占有Mutex的任务挂起,也不要让占有mute ...
- ES6新增rest的用法
arguments类似Array但是并不是Array 而rest就是一个Array 用rest替代atguments eg:给数组排序 //arguments变量的写法: function sortF ...
- python暴力破解wifi密码程序
import time # 破解wifi库 import pywifi from pywifi import const class PoJie(object): def __init__(self, ...
- Linux文件系统概述二
VFS-目录项对象(dentry) 每个文件除了有一个索引节点 inode 数据结构外,还有一个目录项 dentry 数据结构 dentry 结构代表的是逻辑意义上的文件,描述的是文件逻辑上的属性,目 ...
- Django-C001-快速入门
此文章完成度[100%]留着以后忘记的回顾.多写多练多思考,我会努力写出有意思的demo,如果知识点有错误.误导,欢迎大家在评论处写下你的感想或者纠错. Django Django是一个开放源码的We ...
- jwt 登录
/* eslint-disable */ 'use strict'; const Controller = require('egg').Controller; const jwt = require ...
- Linux–varnish(一)
简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高.速度更快.管 ...