Description

据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。你的工作就是去寻找这些牛制造的奇观(最棒的回文)。 在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母'A'-'Z'和'a'-'z'。要你寻找的最长的回文的文章是一个不超过20,000个字符的字符串。 我们将保证最长的回文不会超过2,000个字符(在除去标点符号、空格之前)。

Input

输入文件不会超过20,000字符。这个文件可能一行或多行,但是每行都不超过80个字符(不包括最后的换行符)。

Output

输出的第一行应该包括找到的最长的回文的长度。 下一行或几行应该包括这个回文的原文(没有除去标点符号、空格),把这个回文输出到一行或多行(如果回文中包括换行符)。 如果有多个回文长度都等于最大值,输出最前面出现的那一个。

Sample Input

Confucius say: Madam, I'm Adam.

Sample Output

11
Madam, I'm Adam 解题思路:可以看成求最大回文子串,我们使用最为高效的Manacher算法,现将所给定的字符串大小写统一为小写,去掉非字母部分映射到另一个新串中,并记录好两个串中相同字母的下标位置,
对新串直接使用Manacher算法,最后利用标记位置的数组,找到新串中最长回文子串在原来字符串中的起始位置,输出即可。这里有一个坑点,我一开始一直使用gets()来取字符串,但一直wa,
后来才知道下几行也有可能是所给定的字符串,我们都需要读入。
 #include<cstdio>
#include<stdio.h>
#include<cstring>
#include<algorithm>
const int MAX= 2e5+;
using namespace std;
char s[MAX];
char x[MAX];
char s_new[MAX*];
int a[MAX*];///a数组则是标记数组,下标值是新串中的下标,权值是新串字母在所给字符串中的位置
int p[MAX*];
int pos;
int Init()
{
int i,j,len;
len=strlen(x);
s_new[]='$';
s_new[]='#';
j=;
for(i=; i<len; i++)
{
s_new[j++]=x[i];
s_new[j++]='#';
}
s_new[j]='\0';
return j;
}
int Manacher()
{
int i;
int len=Init();
int max_len=-;
int id;
int mx=;
for (i=; i<len; i++)
{
if(i<mx)
{
p[i]=min(p[*id-i],mx-i);
}
else
{
p[i]=;
}
while (s_new[i-p[i]]==s_new[i+p[i]])
{
p[i]++;
}
if(mx<i+p[i])
{
id=i;
mx=i+p[i];
}
}
for(i=; i<len; i++)
{
if(max_len<p[i]-)
{
max_len=p[i]-;
pos=i/-;///最长回文子串对称轴所在的位置
}
}
return max_len;
}
int main()
{
int i,j,len,ans,starts,ends,k;
char c;
len=,k=;
while((c=getchar())!=EOF)
{
s[k++]=c;
}
s[k]='\0';
len=strlen(s);
j=;
for(i=; i<len; i++)
{
if(s[i]>='A'&&s[i]<='Z')
{
a[j]=i;
x[j]=s[i]+;
j++;
}
else if(s[i]>='a'&&s[i]<='z')
{
a[j]=i;
x[j]=s[i];
j++;
}
}
x[j]='\0';
ans=Manacher();
printf("%d\n",ans);
starts=a[pos-(ans-)/];///起始点
ends=a[pos-(ans-)/+ans-];///终止点
for(i=starts; i<=ends; i++)
{
printf("%c",s[i]);
}
printf("\n");
return ;
}
												

USACO 1.3.3 Calf Flac(Manacher算法)的更多相关文章

  1. USACO Section 1.3 : Calf Flac (calfflac)

    题意:据说假设你给无限仅仅母牛和无限台巨型便携式电脑(有很大的键盘),那么母牛们会制造出世上最优秀的回文. 你的工作就是去寻找这些牛制造的奇观(最优秀的回文). 在寻找回文时不用理睬那些标点符号.空格 ...

  2. USACO 6.2 Calf Flac

    Calf Flac It is said that if you give an infinite number of cows an infinite number of heavy-duty la ...

  3. HDU3068 回文串 Manacher算法

    好久没有刷题了,虽然参加过ACM,但是始终没有融会贯通,没有学个彻底.我干啥都是半吊子,一瓶子不满半瓶子晃荡. 就连简单的Manacher算法我也没有刷过,常常为岁月蹉跎而感到后悔. 问题描述 给定一 ...

  4. manacher算法专题

    一.模板 算法解析:http://www.felix021.com/blog/read.php?2040 *主要用来解决一个字符串中最长回文串的长度,在O(n)时间内,线性复杂度下,求出以每个字符串为 ...

  5. lintcode最长回文子串(Manacher算法)

    题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...

  6. 1089 最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa ...

  7. 51nod1089(最长回文子串之manacher算法)

    题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...

  8. LeetCode 5 Longest Palindromic Substring manacher算法,最长回文子序列,string.substr(start,len) 难度:2

    https://leetcode.com/problems/longest-palindromic-substring/ manacher算法相关:http://blog.csdn.net/ywhor ...

  9. 求最长回文子串:Manacher算法

    主要学习自:http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 问题描述:回文字符串就是左右 ...

随机推荐

  1. 为什么浏览器控制台返回不是undefined,而是一串数字

    setTimeout( (function(){console.log("ok")} )(), 16) 在浏览器控制台输入这段代码的时候返回的不是"undefined&q ...

  2. 在node中使用jwt签发与验证token

    1.什么是token token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识. token是在服务端产生的.如果前端使用用户名和密码向服务端发送请求认证,服务端认证成功,那 ...

  3. 20155203 2016-2017-2《Java程序设计》课程总结

    目录 一.每周作业链接汇总 自认为写得最好一篇博客是?为什么? 作业中阅读量最高的一篇博客是?谈谈经验 作业中与师生交互最多的一篇博客是?谈谈收获 二.实验报告链接汇总 三.代码托管链接 四.课堂项目 ...

  4. 20155213 2016-2017-2《Java程序设计》第四周学习总结

    20155213 2016-2017-2<Java程序设计>第四周学习总结 教材学习内容总结 继承与多态 继承 继承避免多个类间重复定义共同行为,使用关键字extends.继承表明了子类与 ...

  5. 20155322 2016-2017-2 《Java程序设计》第三周学习总结

    20155322 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 本周学习的内容主要为教材的第四第五章,下面是总结: 第四章 主要讨论了五个问题:类与对象.基 ...

  6. 20155336 2016-2017-2 《Java程序设计》第三周学习总结

    20155336 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 第四章 类与对象 定义: 对象(Object):存在的具体实体,具有明确的状态和行为. 类( ...

  7. 分块算法&BZOJ2002

    题目传送门 第一次接触分块...... 分块查找是折半查找和顺序查找的一种改进方法,分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况. 分块修改理论复杂度为O ...

  8. 优步UBER司机全国各地最新奖励政策汇总(持续更新...)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://didi-uber.com/archiv ...

  9. XDS100V3连接Pandaboard ES OMAP4460开发板

    1. 硬件连接如下 2. 使用CCS创建工程,不过好像没有ARM9的内核吧?为啥会出现? 3. 创建目标配置文件 4. 不过确实有ARM9的内核,两个A9内核,一个DSP C64X内核,两个M3的内核 ...

  10. 微服务介绍及Asp.net Core实战项目系列之微服务介绍

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.微服务选型 在做微服务架构的技术选型的时候,我们以“无侵入”和“社区活跃”为主要的考量点,将来升级为原子服务架构.量子服务架构 ...