博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 5371 Hotaru's problem【manacher】
阅读量:7165 次
发布时间:2019-06-29

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

题目链接:

pid=5371

题意:

给出一个长度为n的串,要求找出一条最长连续子串。这个子串要满足:1:能够平均分成三段,2:第一段和第三段相等,3:第一段和第二段回文。求最大子串的长度。

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;const int N = 1100550;int n, l, tmp;int p[2 * N];//记录回文半径int str0[N];//原始串int str[2 * N];//转换后的串void init(){ int i; str[0] = -2; str[1] = -1; l = 2; for (i = 0, l = 2; i
i) p[i] = p[2 * id - i]>(mx - i) ? (mx - i) : p[2 * id - i]; else p[i] = 1;//假设i>=mx,要从头開始匹配 while (str[i + p[i]] == str[i - p[i]]) p[i]++; if (i + p[i]>mx)//若新计算的回文串右端点位置大于mx。要更新po和mx的值 { mx = i + p[i]; id = i; } } int ans = 0; for (int i = 1; i < l; i += 2) for (int j = i + p[i] - 1; j - i > ans; j -= 2) { if (p[j] >= j-i+1 && ans < j - i) { ans = j - i; break; } } return ans / 2 * 3;}int main(){ int t; int cases = 1; scanf("%d", &t); while (t--) { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d",&str0[i]); init(); printf("Case #%d: %d\n", cases++, solve()); } return 0;}

转载地址:http://tqvwm.baihongyu.com/

你可能感兴趣的文章
MySQL Metadata Lock详解
查看>>
[.Net Core] 简单使用 Mvc 内置的 Ioc(续)
查看>>
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类
查看>>
JavaScript数组求最大值 面试题
查看>>
feign调用spring clound eureka 注册中心服务
查看>>
.net framework 4.0上跑webapi 1.0
查看>>
IntelliJ IDEA maven库下载依赖包速度慢的问题
查看>>
【BLE】CC2541之主机端读取特征值
查看>>
一文带你了解 Raft 一致性协议的关键点
查看>>
webpack 4.0的一些小坑
查看>>
Elasticsearch常用最全最常用工具清单
查看>>
Flash Memory 简介【转】
查看>>
C# 把byte[]输出为图片文件
查看>>
数据库中三种范式的讲解
查看>>
RSA加密算法简介
查看>>
(原創) 一個寫constructor常犯的錯 (C/C++)
查看>>
crcdisk.sys. You hurt me!
查看>>
光标阅读机OMRAPI
查看>>
matlab练习程序(奇异值分解压缩图像)
查看>>
动态创建DataTable[转]
查看>>