bzoj 2803 [POI2012]prefixuffix hsh+性质
题目大意
bzoj 2803
对于两个串S1、S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同。例如串ababba和串abbaab是循环相同的。
给出一个长度为n的串S,求满足下面条件的最大的L:
- \(L\le \frac n 2\)
- S的L前缀和S的L后缀是循环相同的。
\(n\le 1,000,000\)
分析
题意相当于找一段前缀=后缀(1)
删掉这两段后再找一段前缀=后缀(2)
长度和就是答案了
其中(1)部分随便搞\(O(n)\) \(hsh\)扫过去就好了
为了复习写了发\(kmp\)
(2)部分有一个神性质,可以\(dp\)
记\(f[i]\)表示不跨越\(mid\)的情况下,以\(i\)开头的前缀和以\(n-i+1\)结束的后缀的最大匹配长度
重要性质:$$f[i-1]<=f[i]+2$$
证明:
令\(j=n-i+1\)
设f[i]对应的最长匹配为\([i,A]\) 与 \([B,j]\) (3)
\(f[i-1]\le f[i]+2\)
就是如图
原式相当于\(i-1\)的匹配位置不超过原来匹配位置的下一位
反证一波:
设匹配到第A+K(K>=2)位
则\([i-1~,~A+K]=[B-K~,~j+1]\)
取这两段的第二位到倒数第二位
有\([i,A+K-1]=[B-(K-1)~,~j]\)
与(3)矛盾
注意
此题神数据卡hash
于是我开了双hash继续Wa
3hash就过了
所以感觉双hsh姿势应该是
一个自然溢出,一个取模,可能效果更好
kmp姿势
本文kmp姿势错误,切勿学习
solution
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
typedef long long LL;
const int Q=1000000007;
const int M=1000007;
const ull W=131;
const ull X=1313;
const LL Z=13131;
int n;
char s[M];
int f[M];
int nxt[M];
ull hsh1[M],pw1[M];
ull hsh2[M],pw2[M];
LL hsh3[M],pw3[M];
void kmp(){
nxt[1]=0;
int i,k=0;
for(i=1;i<=n;i++){
while(k&&s[k]!=s[i]) k=nxt[k];
nxt[i+1]=++k;
}
}
ull gethsh1(int x,int y){
return hsh1[y]-hsh1[x-1]*pw1[y-x+1];
}
ull gethsh2(int x,int y){
return hsh2[y]-hsh2[x-1]*pw2[y-x+1];
}
LL gethsh3(int x,int y){
return ((hsh3[y]-hsh3[x-1]*pw3[y-x+1]%Q)%Q+Q)%Q;
}
int main(){
int i;
scanf("%d",&n);
scanf("%s",s+1);
for(pw1[0]=1,i=1;i<=n;i++) pw1[i]=pw1[i-1]*W;
for(pw2[0]=1,i=1;i<=n;i++) pw2[i]=pw2[i-1]*X;
for(pw3[0]=1,i=1;i<=n;i++) pw3[i]=pw3[i-1]*Z%Q;
for(i=1;i<=n;i++) hsh1[i]=hsh1[i-1]*W+s[i];
for(i=1;i<=n;i++) hsh2[i]=hsh2[i-1]*X+s[i];
for(i=1;i<=n;i++) hsh3[i]=(hsh3[i-1]*Z+s[i])%Q;
f[n/2+1]=0;
for(i=n/2;i;i--){
f[i]=f[i+1]+2;
while(f[i]&&i+f[i]-1>n/2) f[i]--;
while(f[i]&&(gethsh1(i,i+f[i]-1)!=gethsh1(n-i+1-f[i]+1,n-i+1)
||gethsh2(i,i+f[i]-1)!=gethsh2(n-i+1-f[i]+1,n-i+1))
||gethsh3(i,i+f[i]-1)!=gethsh3(n-i+1-f[i]+1,n-i+1)) f[i]--;
}
kmp();
int ans=0;
for(i=nxt[n+1];i;i=nxt[i])
if(i<=n/2) ans=max(ans,(i-1)+f[i]);
printf("%d\n",ans);
return 0;
}
bzoj 2803 [POI2012]prefixuffix hsh+性质的更多相关文章
- bzoj 2803 [Poi2012]Prefixuffix 兼字符串hash入门
打cf的时候遇到的问题,clairs告诉我这是POI2012 的原题..原谅我菜没写过..于是拐过来写这道题并且学了下string hash. 字符串hash基于Rabin-Karp算法,并且对于 ...
- [BZOJ2803][Poi2012]Prefixuffix
2803: [Poi2012]Prefixuffix Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 219 Solved: 95[Submit][St ...
- 【BZOJ2803】[Poi2012]Prefixuffix 结论题
[BZOJ2803][Poi2012]Prefixuffix Description 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串 ...
- 【BZOJ 2803】【POI 2012】Prefixuffix
http://www.lydsy.com/JudgeOnline/problem.php?id=2803 核心思想是利用单调性. 因为长度为L的前缀和后缀循环同构是AB和BA的形式,我们设\(f(i) ...
- bzoj 2799 [Poi2012]Salaries 性质+二分
题目大意 给出一棵n个结点的有根树,结点用正整数1~n编号. 每个结点有一个1~n的正整数权值,不同结点的权值不相同, 并且一个结点的权值一定比它父结点的权值小(根结点的权值最大,一定是n). 现在有 ...
- bzoj 2795 [Poi2012]A Horrible Poem hash+线性筛
题目大意 bzoj 2795 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节. 如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. n<=500 ...
- Bzoj 2789: [Poi2012]Letters 树状数组,逆序对
2789: [Poi2012]Letters Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 278 Solved: 185[Submit][Stat ...
- BZOJ 2795: [Poi2012]A Horrible Poem( hash )
...字符串hash. 假如长度x是一个循环节, 那么对于任意n(x | n)也是一个循环节. 设当前询问区间[l, r]长度为len = ∏piai, 最终答案ans = ∏piai' ,我们只需枚 ...
- BZOJ 2789: [Poi2012]Letters( BIT )
直接求逆序对就行了...时间复杂度O(nlogn) ------------------------------------------------------------------------- ...
随机推荐
- 关于java字符串常量池
今天发现一个好玩的东西 public static void main(String[] args) { String str1 = new StringBuilder(" ...
- 队列的add与offer的区别
两个方法都表示往队列里添加元素 但是当出现异常时,add方法抛出异常 而offer则返回的是false,就是啥事也没有,也不抛异常,也没有添加成功!
- jquery的正则表达式
正则表达式 位置: ^ 开头 $ 结尾 次数: * 0或多个 + 1或多个 ? 0或1个 {n} 就是n个 {n,} 至少n个 {n,m} ...
- linux简单常用命令
除了yum命令,还有些简单的命令,在此记录一下,加深记忆: free -h 查询内存和交换分区. rpm -qa | grep libaio 查看当前环境是否安装某rpm软件包
- C# 获取Google Chrome的书签
其实这个很简单,就是读取一个在用户目录里面的一个Bookmarks文件就好了. 先建立几个实体类 public class GoogleChrome_bookMark_meta_info { publ ...
- 【数学 BSGS】bzoj2242: [SDOI2011]计算器
数论的板子集合…… Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最 ...
- idea 关于高亮显示与选中字符串相同的内容踩过的坑
由 Eclipse 切换到 idea 遇到了很多不熟的地方和踩过的坑,下面记录 idea 关于高亮显示与选中字符串相同的内容踩过的坑. IDEA 2017.2.1 版本修改 Identifier un ...
- vue之列表循环
文档:https://cn.vuejs.org/v2/guide/list.html 当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略.如果数据项的顺序被改变, ...
- Scrapy+Chromium+代理+selenium
上周说到scrapy的基本入门.这周来写写其中遇到的代理和js渲染的坑. js渲染 js是爬虫中毕竟麻烦处理的一块.通常的解决办法是通过抓包,然后查看request信息,接着捕获ajax返回的消息.但 ...
- Python简单试题3
1,水仙花数 水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身 (例如:1^3 + 5^3+ 3^3 = 153) 代码如下: 方法一: for i in range(100, ...