#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. java线程中start和run的区别

    public class Test1 extends Thread { @Override public void run() { while (true) { System.out.println( ...

  2. 配置中心 Spring Cloud config

    配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储.Git以及Subversion. 1.服务端 创建spring boot 项目 主要依赖 <dependenc ...

  3. 《0day安全-软件漏洞分析技术》实验笔记2

    实验 3.4 通用shellcode 工具 Windows XP SP3 Visual C++ 6.0 OD IDA 源代码 见随书代码,参考:https://github.com/jas502n/0 ...

  4. hue改保存记录条数

    参考: https://blog.csdn.net/liaoxiaoyi121121/article/details/80541901 需求: 开发需要保存查询记录的条数从10万改到100万 /etc ...

  5. Spring基于SchedulingConfigurer实现定时任务

    Spring 基于 SchedulingConfigurer 实现定时任务,代码如下: import org.springframework.scheduling.annotation.Schedul ...

  6. 平衡树(Splay、fhq Treap)

    Splay Splay(伸展树)是一种二叉搜索树. 其复杂度为均摊\(O(n\log n)\),所以并不可以可持久化. Splay的核心操作有两个:rotate和splay. pushup: 上传信息 ...

  7. command----常用命令更新ing

    common commands 1:split---拆分文件 [root@localhost split]# split -b 1M split.tar.gz split_ #按1M拆分文件 [roo ...

  8. Windows账户管理

    windows账户管理 最近部署人员给我们提了一个需求,就是希望简化部署过程. 为了能够远程桌面控制终端电脑,他们需要为每台终端设置进行一些设置,例如创建用户名和密码,开启允许 远程桌面设置,以及开机 ...

  9. 第三章 联接查询 T-SQL语言基础

    联接查询 sql server 2008支持四种表运算符----JOIN,APPLY,PIVOT,UNPIVOT. JOIN表运算符是ANSI标准,而APPLY,PIVOT,UNPIVOT是T-SQL ...

  10. O023、理解Nova架构

    参考https://www.cnblogs.com/CloudMan6/p/5410447.html   Compute Service Nova 是OpenStack最核心的服务,负责维护和管理云环 ...