这道题真是非常蛇皮,卡自然溢出,还非常丧病的卡双自然溢出

一句话题意,求出最长的前缀后缀满足\(AB.........BA\)的形式

也就是说外面一个\(next\),里面一个\(next\)

本来想\(kmp\)的,但是发现没有办法做

于是就考虑一下递推

我们可以定住\(A\)的长度,来求出\(B\)的长度

设\(dp[i]\)表示\(A\)的长度为\(i\)的时候,最长的\(B\)有多长,有一个非常显然但是并不怎么好想到的结论就是

\(dp[i-1]<=dp[i]+2\)

从大到小枚举\(A\)的长度,我们可以考虑每次往外扩展一位,也就是\(A\)的长度减少一位,这样的话我们就要考虑左右两边加进来的这两个新字符,显然最好的情况下能让最长的相等的前后缀的长度增加\(2\)

于是我们可以利用这一个单调性进行枚举,利用\(hash\)来进行判断

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define re register
#define maxn 1000005
#define uint unsigned int
#define uLL unsigned long long
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
const int mod=1e9+7;
uLL ha[maxn],pow1[maxn],base=233;
LL sh[maxn],pow2[maxn],Base=233;
char S[maxn];
int n,ans;
int dp[maxn];
inline int read()
{char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
inline uLL get_ha(int l,int r)
{return ha[r]-ha[l-1]*pow1[r-l+1];
}
inline uint get_sh(int l,int r)
{return (sh[r]-sh[l-1]*pow2[r-l+1]%mod+mod)%mod;
}
inline int check(int l1,int r1,int l2,int r2)
{return get_ha(l1,r1)==get_ha(l2,r2)&&get_sh(l1,r1)==get_sh(l2,r2);
}
int main()
{scanf("%d",&n);scanf("%s",S+1);pow1[0]=pow2[0]=1;for(re int i=1;i<=n;i++)ha[i]=ha[i-1]*base+S[i],sh[i]=(sh[i-1]*Base)%mod+S[i];for(re int i=1;i<=n;i++)pow1[i]=pow1[i-1]*base,pow2[i]=pow2[i-1]*Base%mod;for(re int i=(n>>1);i;i--){int now=dp[i+1]+2;while(now+i>(n>>1)) now--;while(now&&!check(i+1,i+now,n-i-now+1,n-i)) now--;dp[i]=now;}for(re int i=1;i<=(n>>1);i++)if(check(1,i,n-i+1,n)) ans=max(i+dp[i],ans);std::cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/10207881.html

【[POI2012]PRE-Prefixuffix】相关推荐

  1. 可持久化线段树(主席树)【舰娘系列】【自编题】

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60083619 向大(hei)佬(e)势力学(di ...

  2. linux上使用strace查看C语言级别的php源码【一种方法】

    如果你希望看到C语言级别的php代码就需要使用strace 这个默认是安装了的,如果没有安装可以 #yum install strace 查看httpd进程 #ps auxw | grep httpd ...

  3. 【网络流24题】D、魔术球问题(有向无环图的最小路径覆盖、思维)

    D.魔术球问题(有向无环图的最小路径覆盖.思维)[省选/NOI- ] P2765 魔术球问题 [问题分析] 枚举答案转化为判定性问题,然后最小路径覆盖,可以转化成二分图最大匹配,从而用最大流解决. [ ...

  4. BZOJ2588 Count on a tree 【树上主席树】

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MB Submit: 7577  Solved: 185 ...

  5. 【前端面试分享】- 寒冬求职下篇

    前言 越来越多的公司都在面试前加入了笔试环节. 有的甚至会根据你的笔试答题情况来决定是否进入面试环节. 当然,进入面试环节,也会时不时的出几道算法或者其他类型的相关的题目让你写出来. 所以不仅要会说, ...

  6. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  7. 【OpenCV入门指南】第十三篇 人脸检测

    原文出处:http://blog.csdn.net/MoreWindows/article/details/8426318#t2 本篇介绍图像处理与模式识别中最热门的一个领域--人脸检测(人脸识别). ...

  8. 【基环树DP】[NOI2012]迷失游乐园

    题目描述 Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多 ...

  9. SpringBoot - 优雅的实现【参数分组校验】高级进阶

    文章目录 Pre 需求 实现三部曲 Step1 定义分组接口 Step2 给参数分配分组 Step3 指定分组 Step4 验证 源码 Pre SpringBoot - 优雅的实现[参数校验]高级进阶 ...

  10. SpringBoot - 优雅的实现【自定义参数校验】高级进阶

    文章目录 Pre 概述 三部曲 Step1 搞自定义注解 Step2 搞校验逻辑 Step3 使用 Step4 验证 附 int 类型的判断 源码 Pre SpringBoot - 优雅的实现[参数校 ...

最新文章

  1. android 显示yuv数据格式,YUV数据格式的理解
  2. 如何在matlab sfunction 函数中调用自己写的函数?
  3. memcache 安装与简单使用
  4. arcgis重心迁移分析_山东省植被覆盖度变化与气候因子相关性分析
  5. Educational Codeforces Round 16 C. Magic Odd Square 矩阵构造
  6. 国内高速前端 Unpkg CDN 替代方案
  7. c语言多线程详,如何用C语言实现多线程
  8. 实习面试问题整理(一)
  9. 【C】define宏展开 typedef类型重命名
  10. [ 深度学习 ] —— 图卷积神经网络 GCN
  11. Intel SGX背景、其他可信计算技术和TEE技术(翻译自Intel SGX Explained)
  12. 自定义滚动条(css)
  13. q87芯片组服务器主板,Intel 100系列芯片组详解:史上最良心!
  14. Android 编译之make基础(转)
  15. Word图片显示不全解决
  16. vnr光学识别怎么打开_VNR教程
  17. golang-vue实现微信小程序分享到朋友圈
  18. 软件测试入门第一步:编写测试报告
  19. 用一个vector删除另一个vector中的元素
  20. 差分方程前向,后向差分

热门文章

  1. python导入excel表格给列命名_Python中对 Excel 的相关详细操作(读取、写入、指定行、指定列、新增sheet工作表)...
  2. internal server error怎么解决_解决redis连接错误:MISCONF Redis is configured to save RDB
  3. mysql多表联合查询事例_MySQL——多表查询详细介绍以及实例
  4. 人工智能是计算机科学的一个分支下定义,阅读中有一篇叫人工智能什么,是说明文...
  5. java9什么时候公布_Java 9正式版有可能被推迟到9月21号发布
  6. WPF 元素相对另外一个元素的 相对位置
  7. Michael Feathers希望消除错误能驱动设计
  8. Oracle 数据块损坏与恢复具体解释
  9. 第二阶段冲刺第八天,6月7日。
  10. 求两个整数中的最大值(不能用比较语句,循环语句)