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 来存储字符串 ...
随机推荐
- 【转】href="#"与"javascript:void(0);"的区别
在工作中,如果我们想把a标签中的链接置成空链接,我们一般会用两种方法: 1 <a href="#" target="_blank"></a&g ...
- 未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0 提供程序
Visual Studio 8使用了Access数据库,provider选择了ACE.OLEDB,但是运行时出现了错误,提示未在本地计算机上注册"Microsoft.ACE.OLEDB.12 ...
- JavaScript组合模式---引入
首先:使用一个例子来引入组合模式,需求为(1)有一个学校有2个班(一班,二班)(2)每个班级分2个小组(一班一组,一班二组,二班一组,二班二组)(3)学校计算机教室有限,每一个小组分着来上课 然后:根 ...
- SqlServer——存储过程(未完工)
http://www.cnblogs.com/blsong/archive/2009/11/30/1613534.html http://blog.csdn.net/lenotang/article/ ...
- 3.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:
转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 概述 在文章:<[Spring学习笔记-MVC-3]SpringMVC返回Json数据-方 ...
- LAMP 2.5 Apache禁止解析php
某个目录下禁止解析 php,这个很有用,我们做网站安全的时候,这个用的很多,比如某些目录可以上传文件, 为了避免上传的文件有木马, 所以我们禁止这个目录下面的访问解析 php. 安装目录下有个data ...
- java判断一个字符串中是否包含全角
public static boolean isAngle(String str){ if(str.getBytes().length==str.length()){ //全是半角 return tr ...
- hadoop再次集群搭建(5)-CDH Install
登录 http://node1.com:7180/.用户名和密码都是admin.启动服务命令是 service cloudera-scm-server start 最开始两个页面直接conti ...
- 将一个string字符串变量分解为字符输出
我们定义一个string 变量str ,然后通过str.length()可以获得该字符串变量的长度: #include<iostream> #include<string> u ...
- C++中的一类临时对象
类名(参数名)这样的对象是临时对象,不能取地址,不能被引用,不过可以给同类型的其他对象赋值,该临时对象定以后可以进行一次操作,然后立即销毁. 当我们定义一个对象以后并不想立即给它赋初值,而是以后给它赋 ...