USACO 1.3.3 Calf Flac(Manacher算法)
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算法)的更多相关文章
- USACO Section 1.3 : Calf Flac (calfflac)
题意:据说假设你给无限仅仅母牛和无限台巨型便携式电脑(有很大的键盘),那么母牛们会制造出世上最优秀的回文. 你的工作就是去寻找这些牛制造的奇观(最优秀的回文). 在寻找回文时不用理睬那些标点符号.空格 ...
- 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 ...
- HDU3068 回文串 Manacher算法
好久没有刷题了,虽然参加过ACM,但是始终没有融会贯通,没有学个彻底.我干啥都是半吊子,一瓶子不满半瓶子晃荡. 就连简单的Manacher算法我也没有刷过,常常为岁月蹉跎而感到后悔. 问题描述 给定一 ...
- manacher算法专题
一.模板 算法解析:http://www.felix021.com/blog/read.php?2040 *主要用来解决一个字符串中最长回文串的长度,在O(n)时间内,线性复杂度下,求出以每个字符串为 ...
- lintcode最长回文子串(Manacher算法)
题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...
- 1089 最长回文子串 V2(Manacher算法)
1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 回文串是指aba.abba.cccbccc.aaaa ...
- 51nod1089(最长回文子串之manacher算法)
题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...
- LeetCode 5 Longest Palindromic Substring manacher算法,最长回文子序列,string.substr(start,len) 难度:2
https://leetcode.com/problems/longest-palindromic-substring/ manacher算法相关:http://blog.csdn.net/ywhor ...
- 求最长回文子串:Manacher算法
主要学习自:http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 问题描述:回文字符串就是左右 ...
随机推荐
- 手把手教你创建私有podspec
本文来自 网易云社区 . CocoaPods是iOS非常好用的类库管理工具,可以非常方便的管理和更新项目中使用到的第三方库,以及将自己项目中的公共组件交由它管理. 工作中比较常用到的是通过CocoaP ...
- IDEA导入eclipse项目并部署到tomcat
1.首先引入本地项目 我这里是maven项目就直接选择的以maven项目引入,如果选eclipse的话,pom文件不会被初始化,部署tomcat会出问题 这项选完后,就一路next,jdk可以在引入的 ...
- 小程序中 function (res)的理解
刚看到小程序里面一段代码 success: function (res) { console.log('搜索结果:'); console.log(res); wx.hideToast(); if (r ...
- Redis报(error) NOAUTH Authentication required.问题解决
启动后 输入auth+空格+密码 ok
- 大数据Hadoop的HA高可用架构集群部署
1 概述 在Hadoop 2.0.0之前,一个Hadoop集群只有一个NameNode,那么NameNode就会存在单点故障的问题,幸运的是Hadoop 2.0.0之后解决了这个问题,即支持N ...
- 重学Verilog(1)
1.线与.线或功能 wor module WO(A, B, C, D, WireOR) input A,B,C,D; output WireOr; wor WireOr; assign WireOr ...
- Matlab_GUI
1.GUI中控件的属性 BackgroundColor 控件的背景 FontSize 控件字体的大小
- 20155233 2006-2007-2 《Java程序设计》第4周学习总结
20155233 2006-2007-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章: 继承:子类继承父类,避免重复的行为定义. extends关键词:继承并扩充行为. ...
- adb的配置
http://jingyan.baidu.com/article/2fb0ba405e815f00f2ec5f9e.html 1. 用快捷键Ctrl + Alt + T 打开终端命令工具,电脑不要插入 ...
- day6 break continue for
.for .break (整个while循环全部结束) )打印1-100的偶数.py )打印1-100的20个偶数.py )while嵌套中的break (就近原则) .continue 错误用法: ...