博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2803[Poi2012]Prefixuffix——hash
阅读量:6193 次
发布时间:2019-06-21

本文共 1562 字,大约阅读时间需要 5 分钟。

题目描述

对于两个串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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long longusing 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);}

转载于:https://www.cnblogs.com/Khada-Jhin/p/9637166.html

你可能感兴趣的文章
C# 设置Excel打印选项及打印excel文档
查看>>
systemd-journald日志持久化的操作方法
查看>>
Linux设备模型 (1)
查看>>
webshell木马简介及防护
查看>>
HP服务器RAID配置 两种方法
查看>>
window设置定时任务执行python脚本
查看>>
php注入代码收集之一
查看>>
4.1-4.4 python的数据类型
查看>>
数据库副本的自动种子设定(自增长)
查看>>
Hadoop深入浅出,Hadoop的部署
查看>>
算法学习之路|欧拉回路初见
查看>>
VSFTP服务器学习笔记
查看>>
Oracle使用透明网关访问SQLSERVER数据库
查看>>
为 instance 配置静态 IP - 每天5分钟玩转 OpenStack(157)
查看>>
MongoDB分布式存储的MapReduce并行查询
查看>>
Apache服务器之------https功能
查看>>
SAP R3 install Chinese language package and Activate .
查看>>
运行QTP测试脚本后,将编译结果写入指定文件(二)
查看>>
dig一些常用例子
查看>>
绝对常用的Linux命令
查看>>