Solution :
把每个串和它们的反转拉一起求一个后缀数组,然后枚举回文串的中心,往回文串两边尽可能添加串,这个过程可以记忆化,如果转移中发现了环说明长度可以无限大。

吐槽:刚开始写的RMQ有点问题,怒改为暴力求lcp然后就A了…10s…..这题好 但是数据有待加强…….

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <bitset>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <iterator>
#include <vector>
#include <queue>
#include <set>
#include <map>#define rep(i, x, y) for (int i = (x), _ = (y); i <= _; ++i)
#define down(i, x, y) for (int i = (x), _ = (y); i >= _; --i)
#define x first
#define y second
#define LX_JUDGEusing namespace std;
typedef long long LL;template<typename T> inline void upMax(T & x, T y) { x < y ? x = y : 0; }
template<typename T> inline void upMin(T & x, T y) { x > y ? x = y : 0; }template<typename T>
inline void read(T & x)
{char c;while ((c = getchar()) < '0' || c > '9') ;for (x = c - '0'; (c = getchar()) >= '0' && c <= '9'; x = x * 10 + c - '0') ;
}const LL inf = 1e15;
const int N = 2e5 + 3e4;namespace suffixArray
{int Sa[N], Rank[N], height[N];int mn[N][19], Log[N], tot;void suffixDa(char * r, int n, int m){static int ws[N];int i, j, p, *x = Rank, *y = height;tot = n;memset(ws, 0, sizeof(int) * m);for (i = 0; i < n; ++i)++ws[x[i] = r[i]];for (i = 1; i < m; ++i)ws[i] += ws[i - 1];for (i = n - 1; ~i; --i)Sa[--ws[x[i]]] = i;for (j = p = 1; p < n; j <<= 1, m = p){for (p = 0, i = n - j; i < n; ++i)y[p++] = i;for (i = 0; i < n; ++i) if (Sa[i] >= j)y[p++] = Sa[i] - j;memset(ws, 0, sizeof(int) * m);for (i = 0; i < n; ++i)++ws[x[i]];for (i = 1; i < m; ++i)ws[i] += ws[i - 1];for (i = n - 1; ~i; --i)Sa[--ws[x[y[i]]]] = y[i];swap(x, y);x[Sa[0]] = 0, p = 1;for (i = 1; i < n; ++i)x[Sa[i]] = (y[Sa[i - 1]] == y[Sa[i]] && y[Sa[i - 1] + j] == y[Sa[i] + j]) ? p - 1 : p++;}for (i = 0; i < n; ++i)Rank[Sa[i]] = i;for (i = p = 0; i < n - 1; ++i){p ? --p : 0;j = Sa[Rank[i] - 1];while (r[i + p] == r[j + p]) ++p;height[Rank[i]] = p;}height[0] = height[1] = height[n] = 0;rep (i, 2, n)Log[i] = Log[i >> 1] + 1;rep (i, 0, n - 1) mn[i][0] = height[i];rep (i, 0, Log[n] - 1){rep (j, 0, n - (1 << (i + 1)) + 1)mn[j][i + 1] = min(mn[j][i], mn[j + (1 << i)][i]);}}int Lcp(int x, int y){if (x == y)return tot - x;x = Rank[x], y = Rank[y];if (x > y)swap(x, y);int k = Log[y - x];return min(mn[x + 1][k], mn[y - (1 << k) + 1][k]);}
}char str[N];
int belong[N], start[211], last[211];
int n, m;LL f[N];
bool ins[N];LL calc(int x)
{using suffixArray::Lcp;if (str[x] < 'a')x = m;if (ins[x]) return inf;else if (f[x] > 0) return f[x];LL &ans = f[x];ins[x] = 1;if (x == m){rep (i, 1, n + n)upMax(ans, calc(start[i]));}else {int p = belong[x];rep (j, (p <= n ? n + 1 : 1), (p <= n ? n + n : n)){int t = min(Lcp(x, start[j]), min(last[p] - x, last[j] - start[j]));if (x + t == last[p])upMax(ans, calc(start[j] + t) + t * 2);else if (start[j] + t == last[j])upMax(ans, calc(x + t) + t * 2);else upMax(ans, 2ll * t);}}upMax(ans, 0ll), upMin(ans, inf);ins[x] = 0;return ans;
}int main()
{
#ifdef LX_JUDGEfreopen("in.txt", "r", stdin);
#endifread(n);rep (i, 1, n){scanf("%s", str + m);start[i] = m;while (str[m])belong[m++] = i;last[i] = m;str[m++] = 'a' - 1;}int cur = 0;rep (i, n + 1, n + n){start[i] = m;while (str[cur] >= 'a'){belong[m] = i;str[m++] = str[cur++];}last[i] = m;str[m++] = str[cur++];reverse(str + start[i], str + last[i]);}str[m++] = 0;suffixArray::suffixDa(str, m, 128);memset(f, -1, sizeof(f));LL ans = calc(m);rep (i, 1, n){using suffixArray::Lcp;for (int j = start[i], k = last[i + n] - 1; j < last[i]; ++j, --k){int tmp = min(Lcp(j, k), min(last[i] - j, last[i + n] - k));if (j + tmp == last[i])upMax(ans, calc(k + tmp) + 2 * tmp - 1);else if (k + tmp == last[i + n])upMax(ans, calc(j + tmp) + 2 * tmp - 1);else upMax(ans, 2ll * tmp - 1);}for (int j = start[i] + 1, k = last[i + n] - 1; j < last[i]; ++j, --k){int tmp = min(Lcp(j, k), min(last[i] - j, last[i + n] - k));if (j + tmp == last[i])upMax(ans, calc(k + tmp) + tmp * 2);else if (k + tmp == last[i + n])upMax(ans, calc(j + tmp) + tmp * 2);else upMax(ans, 2ll * tmp);}}ans < inf ? printf("%lld\n", ans) : puts("Infinity");return 0;
}

[BZOJ 3654] 图样图森破相关推荐

  1. 【清华夏令营2016模拟5.31】图森破

    题目 Description 小火车励志成为一名辣鸡出题人,但是要成为一名辣鸡出题人,代码必须跑得比谁都快,这样就能把他们都卡常数了!为了锻炼自己,他找到了一位长者--罗长者,罗长者说:"你 ...

  2. 题解 [校内测试]图森破

    题意 设 f(n)f(n)f(n) 为满足以下条件的字符串个数: 串长为 SSS,字符集为 [0,9][0,9][0,9]. 设 sufisuf_isufi​ 为第 iii 个字符对应的后缀在最后补 ...

  3. 常测长策(20180222~)

    已经很久没有写过测试总结了,主要是2月22日的测试题很有意思-- 20180222 戊戌年正月初七 THU YYR S2 这套题目,嗯-- T1是一道很好的DP.需要充分了解凸包的构建过程.仔细一番考 ...

  4. GitHub上7000+ Star的Python常用代码合集

    作者 | 二胖并不胖 来源 | 大数据前沿(ID:bigdataqianyan) 今天二胖给大家介绍一个由一个国外小哥用好几年时间维护的Python代码合集.简单来说就是,这个程序员小哥在几年前开始保 ...

  5. 心中无码,自然高清 | 联合去马赛克与超分辨率研究论文Pytorch复现

    作者 | 知凡,个人公众号:林木蔚然读书会(ID:EspressoOcean),知乎ID:Uno Whoiam 本文授权转载自知乎 本文结构 简单扫盲 什么是去马赛克 什么是超分辨率 <Deep ...

  6. 算法面试经常需要你手写的三个排序算法(Python语言)

    作者 | 程序员小吴 来源 | 五分钟学算法(ID: CXYxiaowu) 1. 归并排序 1.1 算法步骤 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列: 设定两个指针,最初 ...

  7. 开放式创新改变世界——OpenStack生态系统将重新洗牌

    摘要:OpenStack基础软件开发周期长.投入大.技术创新转化成产品需要更多时间,超越公司的开放协作才有利于和促进产业繁荣发展.OpenStack能否成为继Linux之后开放式创新的又一成功案例呢? ...

  8. LocalDateTime、OffsetDateTime、ZonedDateTime互转,这一篇绝对喂饱你

    在JSR 310日期时间体系了,一共有三个API可用于表示日期时间: LocalDateTime:本地日期时间 OffsetDateTime:带偏移量的日期时间 ZonedDateTime:带时区的日 ...

  9. 创业者如何小步快跑,从0开始实现自己的产品?

    2019独角兽企业重金招聘Python工程师标准>>> 某周末和学员聊完,兴起,在在行上的分类里面找自己.可是在产品里面,找来找去,完全不见踪影,反而在研发和运营里面找到了我的话题, ...

  10. U-Mail邮件网关测试勒索病毒样例图

    俗话说得好,"患难见真情",也就是说平时看上去山盟海誓甜言蜜语,但一到危机关头各自飞了:同样的,日常上网看到各种平台言之凿凿的夸下海口说自己的平台固若金汤,对病毒防范一级棒,但最近 ...

最新文章

  1. linux-centos7-yum安装mcrypt**
  2. OSPF LSA序列号问题
  3. 如何配置Microsoft LoopBack Adapter 配置为系统的主网络适配器
  4. 注意力机制在softmax时需要除以一个根号8的作用
  5. Socket之UDP服务器【Python】
  6. Tomcat5.5报错:Apache Portable Runtime was not found
  7. 课题申报书范文_课题申报书(范文5篇)
  8. 采购模板html5,蓝色的采购信息管理系统手机界面wap模板
  9. 2018年《大数据》杂志调查问卷
  10. java多状态机_一个java状态机样例的代码
  11. flask-mail异步发送邮件_Python爬虫系列:用邮件来通知爬虫异常状况
  12. python路径相关小问题
  13. 对所谓原生软件的偏执
  14. spark性能调优05-troubleshooting处理
  15. javascript DOM操作
  16. Windows XP / 2003 / Vista 原版光盘镜像(下载)及其主要特征
  17. PCB Dk、Df和介质损耗
  18. 12年双11:从春雷到秋实,为复苏喝彩
  19. 常见水果/蔬菜/植物nbsp;英语词汇大全
  20. 深入浅出达梦SQL(基础篇)

热门文章

  1. Unity 百度语音合成
  2. http是什么,其实很简单
  3. C语言:将3*4矩阵中找出行最大,列最小的那个元素。-将低于平均值的人数作为函数返回值,将低于平均分的分数放入below数组中。...
  4. Qt进阶-汉字转拼音/全拼
  5. 全栈项目-乐优商场-分类管理-前端-页面渲染
  6. linux 录制软件下载,Ubuntu下安装屏幕录像软件(SimpleScreenRecorder)
  7. 【移动端】企业微信移动app测试实战(2)、(3)
  8. 创建asp网站iis发布网站用IP地址进行访问
  9. php重定向和伪静态,「PHP重定向与伪静态区别」- 海风纷飞Blog
  10. 科罗拉多大学波尔得分校计算机科学,科罗拉多大学波尔得分校院系设置