题目描述

对于两个串S1、S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同。例如串ababba和串abbaab是循环相同的。
给出一个长度为n的串S,求满足下面条件的最大的L:
1. L<=n/2
2. S的L前缀和S的L后缀是循环相同的。

输入

第一行一个正整数n (n<=1,000,000)。第二行n个小写英文字母,表示串S。

输出

一个整数,表示最大的L。

样例输入

15
ababbabababbaab

样例输出

6
 
假设两个串是循环同构的,那么这两个串可以表示成x+y和y+x的形式(其中x,y为两个字符串)
设f[i]表示前后都去掉i个字符后能匹配的最长前后缀长度,即y的最长长度。
手画一下能够发现对于位于左一半的i和i+1,f[i]<=f[i+1]+2。如果大于了就说明f[i+1]还能更大。
那么就可以从中间向开头转移f[i],最后求出i+f[i]的最大值即可。这道题卡自然溢出。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll h[1000010];
ll g[1000010];
ll base1[1000010];
ll base2[1000010];
char ch[1000010];
int mod=1e9+7;
int n;
int f[1000010];
int ans=0;
bool check(int x,int y,int l)
{
ll s1,s2,t1,t2;
s1=((h[x+l-1]-h[x-1]*base1[l])%mod+mod)%mod;
s2=((g[x+l-1]-g[x-1]*base2[l])%mod+mod)%mod;
t1=((h[y+l-1]-h[y-1]*base1[l])%mod+mod)%mod;
t2=((g[y+l-1]-g[y-1]*base2[l])%mod+mod)%mod;
if(s1==t1&&s2==t2)
{
return true;
}
return false;
}
int main()
{
scanf("%d",&n);
scanf("%s",ch+1);
base1[0]=1;
base2[0]=1;
for(int i=1;i<=n;i++)
{
base1[i]=base1[i-1]*233%mod;
base2[i]=base2[i-1]*2333%mod;
h[i]=(h[i-1]*233+(ch[i]-96))%mod;
g[i]=(g[i-1]*2333+(ch[i]-96))%mod;
}
for(int i=n/2;i>=1;i--)
{
f[i]=min(f[i+1]+2,(n-2*i)/2);
while(f[i]&&(!check(i+1,n-f[i]+1-i,f[i])))
{
f[i]--;
}
}
for(int i=1;i<=n/2;i++)
{
if(!check(1,n-i+1,i))
{
continue;
}
ans=max(ans,f[i]+i);
}
printf("%d",ans);
}

BZOJ2803[Poi2012]Prefixuffix——hash的更多相关文章

  1. [BZOJ2803][Poi2012]Prefixuffix

    2803: [Poi2012]Prefixuffix Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 219  Solved: 95[Submit][St ...

  2. 【BZOJ2803】[Poi2012]Prefixuffix 结论题

    [BZOJ2803][Poi2012]Prefixuffix Description 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串 ...

  3. bzoj 2803 [Poi2012]Prefixuffix 兼字符串hash入门

    打cf的时候遇到的问题,clairs告诉我这是POI2012 的原题..原谅我菜没写过..于是拐过来写这道题并且学了下string hash.   字符串hash基于Rabin-Karp算法,并且对于 ...

  4. bzoj 2803 [POI2012]prefixuffix hsh+性质

    题目大意 bzoj 2803 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串abbaab是循环相同的. 给出一个长度为n的串S,求满 ...

  5. POI2012题解

    POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. Work at DP

    转载请注明出处:http://www.cnblogs.com/TSHugh/p/8858805.html Prepared: (无notes的波兰题目的notes见我的波兰题目补全计划)BZOJ #3 ...

  8. BZOJ 2795: [Poi2012]A Horrible Poem( hash )

    ...字符串hash. 假如长度x是一个循环节, 那么对于任意n(x | n)也是一个循环节. 设当前询问区间[l, r]长度为len = ∏piai, 最终答案ans = ∏piai' ,我们只需枚 ...

  9. bzoj 2795 [Poi2012]A Horrible Poem hash+数论

    2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 640  Solved: 322[Subm ...

随机推荐

  1. QT 读取txt文件的几种方法

    废话不说直接上代码 1. QString displayString; QFile file("/home/alvin/text.txt"); if(!file.open(QIOD ...

  2. linxu系统知识和简单命令

    Linux目录基本知识 / 根目录 /bin 存放必要的命令 (binary) /boot 存放内核以及启动所需的文件(引导/自引/启动/开机程序) /dev 存放设备文件 (devices) /et ...

  3. android精品开源项目整理

    转载地址:http://www.eoeandroid.com/thread-311366-1-1.html 前言:无论你是android的初学者,还有是Android开发了好多年的高手,可能都会有很多 ...

  4. Android 新加几个开源项目

    http://www.androidviews.net  http://www.theultimateandroidlibrary.com test 最低版本: 简介: 地址: 效果图: test A ...

  5. "system:serviceaccount:rook-ceph-system:rook-ceph-system" cannot get pods/log in the namespace "rook-ceph"

    1.kubectl logs -f   rook-ceph-operator-86776bbc44-cv5hs   -n rook-ceph-system 日志:E | op-cluster: unk ...

  6. SkylineGlobe 如何使用二次开发接口创建粒子效果

    SkylineGlobe在6.6版本,ICreator66接口新增加了CreateEffect方法,用来创建粒子效果对象: 以及ITerrainEffect66对象接口,可以灵活设置粒子效果对象的相关 ...

  7. 《MySQL必知必会》[07] 管理事务处理

    1.管理事务处理 一个或多个数据库操作(查询/更新等)组成"事务",也就是说,事务实际上是一组按顺序执行的操作单位: 原子性:整个事务为整体执行,要么执行,要么不执行,不能出现执行 ...

  8. React + js-xlsx构建Excel文件上传预览功能

    首先要准备react开发环境以及js-xlsx插件 1. 此处省略安装react安装步骤 2.下载js-xlsx插件 yarn add xlsx 或者 npm install xlsx 在项目中引入 ...

  9. 《Head First 设计模式》例子的C++实现(1 策略模式)

    最近在学习设计模式,用的是 <Head First 设计模式>这本书.感觉这本书写的还是很不错的,深入浅出的介绍了各种常用的设计模式.唯一有点不方便的地方是这本书的例子全都是用的 Java ...

  10. Verilog设计异步FIFO

    转自http://ninghechuan.com 异步FIFO有两个异步时钟,一个端口写入数据,一个端口读出数据.通常被用于数据的跨时钟域的传输. 同步FIFO的设计.一个时钟控制一个计数器,计数器增 ...