#1032 : 最长回文子串

时间限制:1000ms
单点时限:1000ms
内存限制:64MB

描述

小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。

这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?”

小Ho奇怪的问道:“什么叫做最长回文子串呢?”

小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串指的是12421这种从前往后读和从后往前读一模一样的字符串,所以最长回文子串的意思就是这个字符串中最长的身为回文串的子串啦~”

小Ho道:“原来如此!那么我该怎么得到这些字符串呢?我又应该怎么告诉你我所计算出的最长回文子串呢?

小Hi笑着说道:“这个很容易啦,你只需要写一个程序,先从标准输入读取一个整数N(N<=30),代表我给你的字符串的个数,然后接下来的就是我要给你的那N个字符串(字符串长度<=10^6)啦。而你要告诉我你的答案的话,只要将你计算出的最长回文子串的长度按照我给你的顺序依次输出到标准输出就可以了!你看这就是一个例子。”

样例输入
3
abababa
aaaabaa
acacdas
样例输出
7
5
3

思路:

1.O(n平方)的方法

记录每个位置,从当前位置,向头尾遍历,直到左右不想等,结束,记录回文串的长度。注意:需要分奇回文和偶回文。

反正hiho上是超时了,看来必须要写一种O(n)复杂度的方法呀。

程序:

 #include "iostream"
#include "string.h"
#include "string" using namespace std; string str;
int n, maxnum; int main()
{
cin >> n;
while (n--)
{
cin >> str;
maxnum = ;
for (int i = ; i < strlen(str.c_str()); i++)
{
int j = ;//ji
while (i - j >= && i + j<strlen(str.c_str()))
{
if (str[i - j] == str[i + j])
j++;
else
break;
}
j = j * - ; int k = ;//ou
while (i - k >= && i + k + <strlen(str.c_str()))
{
if (str[i - k] == str[i + k + ])
k++;
else
break;
}
k = k * ; int tag = j > k ? j : k;
if (tag > maxnum)
maxnum = tag;
}
cout << maxnum << endl;
}
}

2.

Manacher算法。时间O(n),空间O(n)。------完全OK!

主要目的就是要减少计算量,在”中心扩展“法的基础上,节省更多的计算量。下面介绍这种处理方法。

在字符串中间插入符号,将串构造成基回文串

 #include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std; int longestPalindrome(string s) {
string ss = "#";
for (int i = ; i<s.length(); i++)
{
ss += s[i];
ss += '#';
}
vector<int> P(ss.length(), ); int center = , boundary = , maxLen = , resCenter = ;
for (int i = ; i<ss.length() - ; i++) {
int iMirror = * center - i;
P[i] = (boundary>i) ? min(boundary - i, P[iMirror]) : ;
while (i - - P[i] >= && i + + P[i] <= ss.length() - && ss[i + + P[i]] == ss[i - - P[i]])
P[i]++;
if (i + P[i]>boundary) { // 更新边界
center = i;
boundary = i + P[i];
}
if (P[i]>maxLen) { // 更新res
maxLen = P[i];
resCenter = i;
}
}
return maxLen;
} int main()
{
int n;
cin >> n; while (n--)
{
string str;
cin >> str;
cout << longestPalindrome(str) << endl;
}
return ;
}

hiho #1032: 最长回文子串的更多相关文章

  1. HiHo 1032 最长回文子串 (Manacher算法求解)

    /** * 求解最长回文字串,Manacher算法o(n)求解最长回文子串问题 **/ #include<cstdio> #include<cstdlib> #include& ...

  2. hihocoder #1032 : 最长回文子串【 manacher算法实现 】

    #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  3. hihoCoder #1032 : 最长回文子串 [ Manacher算法--O(n)回文子串算法 ]

    传送门 #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相 ...

  4. hihoCoder hiho一下 第一周 #1032 : 最长回文子串 (Manacher)

    题意:给一个字符串,求最长回文子串的长度. 思路: (1)暴力穷举.O(n^3) -----绝对不行. 穷举所有可能的出现子串O(n^2),再判断是否回文O(n).就是O(n*n*n)了. (2)记录 ...

  5. hihocoder #1032 : 最长回文子串 Manacher算法

    题目链接: https://hihocoder.com/problemset/problem/1032?sid=868170 最长回文子串 时间限制:1000ms内存限制:64MB 问题描述 小Hi和 ...

  6. hihocode #1032 : 最长回文子串【manacher】模板题

    题目链接:https://vjudge.net/problem/HihoCoder-1032 manacher算法详解:https://blog.csdn.net/dyx404514/article/ ...

  7. [hihoCoder] #1032 : 最长回文子串

    时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这 ...

  8. hihocoder 1032 最长回文子串(Manacher)

    传送门 #include<queue> #include<cmath> #include<cstdio> #include<cstring> #incl ...

  9. 【hiho一下】第一周 最长回文子串

    题目1:最长回文子串 题目原文:http://hihocoder.com/contest/hiho1/problem/1 [题目解读] 题目与 POJ 3974 palindrome 基本同样.求解最 ...

随机推荐

  1. TensorFlow实战第二课(添加神经层)

    莫烦tensorflow实战教学 1.添加神经层 #add_layer() import tensorflow as tf def add_layer(inputs,in_size,out_size, ...

  2. 【DSP开发】【并行计算-CUDA开发】TI OpenCL v01.01.xx

    TI OpenCL v01.01.xx TI OpenCL™ Runtime Documentation Contents: Introduction OpenCL 1.1 Reference Mat ...

  3. SQL的DDL和DML

    DDL:数据定义语言,定义库.表结构用的DML:数据操作语言,增.删.改.查DCL:数据控制语言,权限.事务等控制语句 (一)DDL1.操作数据库的语句(1)查看当前DBMS中的所有数据库show d ...

  4. 3.Java和hadoop的安装

    先创建目录 [hadoop@node1 opt]$ cd /opt [hadoop@node1 opt]$ sudo mkdir /opt/softwares [hadoop@node1 opt]$ ...

  5. 【DP 好题】hihoCoder #1520 古老数字

    题目链接 这道题的要点是状态转移的顺序. 要从低位向高位进行状态转移. Implementation string s; cin >> s; reverse(all(s)); int x, ...

  6. HTML页面左上角图标

    显示网页左上角标志图标 <link rel="shortcut icon"type="image/x-icon"href="images/fav ...

  7. Python3学习笔记-更新中

    1.Python概况 2.Anaconda安装及使用 3.Pycharm安装及使用 4.Hello World!!! 5.数据类型及类型转换 6.分支结构 7.循环语句 8.异常

  8. 【NOIP2017】跳房子

    这题我0分. 比赛时,我一眼出正解,哈哈,太水了! 这题不就是一个二分+DP+单调队列吗? 然而,细节决定成败. 我错了许多细节,就挂了. 我只考了0分... 首先,这题满足一个条件: 保证g变大后, ...

  9. 最长相同01数的子串(map搞搞)--牛客第三场 -- Crazy Binary String

    题意: 如题. 或者用我的数组分治也可以,就是有点愚蠢. //#include <bits/stdc++.h> #include <map> #include <iost ...

  10. 了解MyISAM与InnoDB的索引差异(转)

    出处原文: 1分钟了解MyISAM与InnoDB的索引差异 数据库的索引分为主键索引(Primary Inkex)与普通索引(Secondary Index).InnoDB和MyISAM是怎么利用B+ ...