luogu1210 回文检测
Manacher
正确读法:抹内A撤(马拉车)
(跟着假硕学英语)
我们把原来的字符串,通过玄学处理,变成只留下字母,且每两个字母之间有一个奇怪的字符的那种Manacher专用字符串。
建立双射关系f[i]表示a[i]在b中的位置(如果a[i]是字母),f_[i]表示b[i]在a中的位置(如果b[i]是字母)
然后对b数组跑Manacher
然后找最长回文子串回文中心的位置,通过这个位置直接在b数组中先找左右端点,然后在找到a数组中对应位置输出
数组要开到四万(下面的代码开了两万RE一个点,想抄题解的自己改一下):
#include <bits/stdc++.h>
using namespace std;
char a[20010], b[20010];
int f[20010], f_[20010], res[20010];
int main()
{
int p = 0;
while((a[p] = getchar())!=EOF)p++;
a[p]=0;
int len = strlen(a), j = 1;
memset(b, 0x25, sizeof(b));
for (int i = 0; i < len; i++)
{
if(isalpha(a[i]))
{
f[i] = j;
f_[j] = i;
b[j] = a[i];
if(islower(b[j]))
b[j] -= 32;
j+=2;
}
}
//从[0,j)跑马拉车
int more = 0, pos = 0;
for (int i = 0; i < j; i++)
{
if (more > i)
res[i] = min(res[2 * pos - i], more - i);
else
res[i] = 1;
while (i + res[i] < j && i - res[i] >= 0 && b[i+res[i]] == b[i-res[i]])
res[i]++;
if (i + res[i] - 1 > more)
{
more = i + res[i] - 1;
pos = i;
}
}
int maxLengthPos = 0;
for (int i = 1; i < j; i++)
if(res[i] > res[maxLengthPos])
maxLengthPos = i;
int r = maxLengthPos + res[maxLengthPos] - 2, l = maxLengthPos - res[maxLengthPos] + 2;
int L = f_[l], R = f_[r];
//printf("%d %d %d %d\n", l, r, L, R);
printf("%d\n", 1 + (r - l) / 2);
for (int i = L; i <= R; i++)
printf("%c", a[i]);
return 0;
}
让我们一起膜拜大佬林瑞堂@olinr
luogu1210 回文检测的更多相关文章
- C#进行回文检测,判断字符串是否是回文的代码
下面代码内容是关于C#进行回文检测,判断字符串是否是回文的代码,应该是对各位朋友有些好处. Console.WriteLine("算法1:请输入一个字符串!");string st ...
- Manacher【p1210】回文检测
题目描述--->P1210 回文检测 分析: 看到回文显然想到了manacher算法(线性求解回文串问题 如果不了解还是去敲一下板子,学习一下比较好.-->manacher 题目要求我们求 ...
- java_回文检测
package bao; import java.util.Scanner; public class Work { public static boolean digui(String str1,i ...
- 回文检测 [USACO Training Section 1.3]
题目描述 据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文.你的工作就是去寻找这些牛制造的奇观(最棒的回文). 在寻找回文时不用理睬那些标点符号.空格( ...
- 「Luogu P1210」回文检测 解题报告
题面 这是一道诡异的黄题 居然让你求一串吧啦吧啦的东西中 字母(大小写)最长的回文串的长度,还要输出完整的串 吐血 思路: 保持淡定,我们啥都不会,就会Manacher,那就用Manacher大法! ...
- 利用python的双向队列(Deque)数据结构实现回文检测的算法
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- 7.Deque的应用案例-回文检查
- 回文检测:设计程序,检测一个字符串是否为回文. - 回文:回文是一个字符串,读取首尾相同的字符,例如,radar toot madam. - 分析:该问题的解决方案将使用 deque 来存储字符串 ...
- 算法——回文(palindrome)
回文(palindrome):指的是从头读到尾与从尾读到头一模一样的字符串. 分别在C.Java与Python实现回文检测: C: #include <stdio.h> #include ...
- 07 Deque的应用案例-回文检查
- 回文检测:设计程序,检测一个字符串是否为回文. - 回文:回文是一个字符串,读取首尾相同的字符,例如,radar toot madam. - 分析:该问题的解决方案将使用 deque 来存储字符串 ...
随机推荐
- 10-30SQLserver基础--(备份和还原、分离和附加数据库)、语句查询操作
一.数据库是一个大容量的存储数据的仓库,为了保证数据完整性,防止一些数据的意外丢失等情况,需要对数据进行备份和还原. 备份数据不影响数据库的正常运行. 1.备份.还原数据库 首先对数据库进行备份,操作 ...
- 清空select标签中option选项的4种不同方式
转自:https://blog.csdn.net/pt_sm/article/details/53521560 方法一 document.getElementById("selectid&q ...
- UML设计九种图例
一.作为一种建模语言,UML的定义包括UML语义和UML表示法两个部分. UML语义:描述基于UML的精确元模型定义. UML表示法:定义UML符号的表示法,为开发者或开发工具使用这些图形符号和文本语 ...
- 部署和调优 1.3 pureftp部署和优化-1
FTP 是 File Transfe Protocol(文件传输协议)的英文简称,而中文简称为 “文传协议” 用于 Internet 上的控制件的双向传输. 可以访问 www.pureftpd. ...
- 如何边遍历集合边删除元素--使用Iterator中的remove()方法
在遍历集合时,想将符合条件的某些元素删除,开始是用了下面的方法 public static void main(String[] args) throws UnsupportedEncodingExc ...
- Windows libQGLViewer2.7.0,libQGLViewer2.6.2与g2o20160427, g2o20170730编译生成G2O
1. Win10, VS2013, libQGLViewer2.6.2 和 QT5.6.3编译时候会出错,初步判断libQGLViewer2.6.2不支持QT5 错误 error LNK1120: 个 ...
- p4213 【模板】杜教筛(Sum)
传送门 分析 我们知道 $\varphi * 1 = id$ $\mu * 1 = e$ 杜教筛即可 代码 #include<iostream> #include<cstdio> ...
- 动态tab页
1.前台代码 <%-- builed by manage.aspx.cmt [ver:2015.25.26] at 2015-06-26 15:25:42 --%> <%@ Pag ...
- CLRMonitor - 跟踪CLR内部执行过程工具
CLRMonitor v1.0.1511.13 点击此处下载 软件介绍:这款软件主要用于跟踪CLR内部执行过程,定位当前程序执行的命名空间以及方法名等信息.可以迅速找到被跟踪程序的当前执行方法名.本软 ...
- Entity Framework Tutorial Basics(2):What is Entity Framework?
What is Entity Framework? Writing and managing ADO.Net code for data access is a tedious and monoton ...