题目1:最长回文子串

题目原文:http://hihocoder.com/contest/hiho1/problem/1

【题目解读】

题目与 POJ 3974 palindrome 基本同样。求解最长回文子串:manacher算法

理解了非常长时间,才理解了大概。

然后在编码过程中,又不断有细节错误。写了两天才写完。

manacher 算法的详细过程见以上网址。当中的精髓有:

(1)利用回文串的对称性,首先对于以某个位置为中心的回文串长度,“预測”一个下限,降低之后的计算。

(2)不断扩大“预測”的范围,因此须要最远的右边界。即最大的 max = id + p[id]。

【hiho提示】

【提示一】【提示二】都是暴力求解,只是提供了极好的推断最长回文子串的方法“不是枚举它的起止位置而是尝试枚举子串的中心位置。然后再从小到大依次枚举这个子串的长度,一旦发现已经不是一个回文串了就继续尝试下一个中心位置。”

【提示三】介绍了manacher算法。

【提示四】提出了关于字符串中心点导致的奇偶性问题,同一时候提出了“在原来字符串的基础上。在随意两个相邻的字符间都插入一个特殊字符,是不是不管是原来字符串中长度为奇数的回文子串还是长度为偶数的回文子串。在新的字符串中都有一个长度为奇数的回文子串与之进行相应呢?”

事实上还能够考虑使用另外一个特殊字符作为字符串的开头标志。

【编写细节】

下面是我自己在编写中碰到的各类逗比问题。。。

总结自己,以示后人。

(1)原本尝试使用 str 来扩展原本的字符串变为插入特殊字符的字符串。

可是此举改变了字符串原先的长度 strlen,而且造成了非常多其它问题。。。

于是新开了数组。

(2)10^6 的数组全然能够开。建议用 char* 不要用 string(事实上我 string 不熟悉)。

(3)由于须要扩大可“预測”范围,所以最右终点 max 不断右移。与之相应的中心 id (j 的对称点是2*id-j )也不断变化。

可是这俩与最大子串长度 max_p 没有联系,须要分为两组比較并存储

(4)最開始 while() 计算回文串长度时我写了一个函数。可是我函数最開始置 0 了回文串半径。

。。SB啊!

那我之前的“预測”不就白做了么!

逗比啊。

(5)最奇妙的是。。

公用变量数组,假设放在main函数里就是RE,放在main函数外当作全局变量就是AC。好奇怪。

。。希望高人解答!

跟心凯大神叫交流后,他的回答是,就是:main函数里面定义的都是局部变量,这些变量是在程序执行时分配到程序栈空间里面的。而定义在函数外的全局变量是定义在程序数据段(较大)的,RE是由于栈的大小不够分配那么多的空间,多出来的空间超出了栈的范围,不能被Main函数訪问,就报错了。

所以在C里面开大数组都是开成全局变量

【AC代码】

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 1000005 char str[MAX];
char s[MAX*2];
long p[MAX*2];
long len, slen;
long mx, id, mxp;
int t; int main()
{
scanf("%d", &t);
for(int k=0; k<t; k++)
{
scanf("%s", str);
len = strlen(str);
s[0] = '#';
for(long i=0; i<len; i++)
{
s[i*2 + 1] = str[i];
s[i*2 + 2] = '#';
} slen = len*2+1;
id = 0;
mx = 0;
mxp = 0;
memset(p, 0, MAX*sizeof(long));
for(long j=0; j<slen; j++)
{
if(mx > j)
{
p[j] = p[2*id-j]>(mx-j)?(mx-j):p[2*id-j];
}
while(s[j-p[j]]==s[j+p[j]] && (j-p[j]>=0) && (j+p[j]<slen))
p[j]++; if(mxp < p[j]) mxp = p[j];
if(mx < (j+p[j]))
{
id = j;
mx = (j+p[j]);
}
}
printf("%ld\n", mxp-1);
}
return 0;
}

【hiho一下】第一周 最长回文子串的更多相关文章

  1. hiho一下 第一周 最长回文子串

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

  2. hiho一下第一周 最长回文子串

    题目链接:http://hihocoder.com/contest/hiho1/problem/1 #include <iostream> #include <cstdio> ...

  3. hiho 第1周 最长回文子串

    题目链接:http://hihocoder.com/problemset/problem/1032 #include <bits/stdc++.h> using namespace std ...

  4. hihoCoder第一周---最长回文子串(1032)

    其实这就是mancher算法的板子题,贴个代码好了. 思想请见我的另一篇博客: https://blog.csdn.net/qq_41090676/article/details/86768361 # ...

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

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

  6. hihocoder 第一周 最长回文字串

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

  7. hiho #1032: 最长回文子串

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

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

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

  9. Manacher's algorithm: 最长回文子串算法

    Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...

随机推荐

  1. Jackson反序列化提示:Can not deserialize instance of Task out of START_ARRAY token

    解决方法: 1.没有绝对的方法,只能不断的测试和排查. 2.检查一下JSON数据和实体的字段结构是不是不一致导致的.比如JSON数据是数组,而实体字段为非数组. 参考: https://stackov ...

  2. 深入分析GCC 与 编绎系统透视

  3. SQL获取当月天数的几种方法

    原文:SQL获取当月天数的几种方法 日期直接减去int类型的数字 等于 DATEADD(DAY,- 数字,日期) 下面三种方法: 1,日期加一个月减去当前天数,相当于这个月最后一天的日期.然后获取天数 ...

  4. DefaultHttpRequestRetryHandler有重试3次的机制啊 为什么要重写?

    DefaultHttpRequestRetryHandler有重试3次的机制啊 为什么要重写?

  5. 【微信】微信小程序 微信开发工具 创建js文件报错 pages/module/module.js 出现脚本错误或者未正确调用 Page()

    创建报错pages/module/module.js 出现脚本错误或者未正确调用 Page() 解决方法: 在js文件中添加 Page({ })

  6. 通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃

    1.基本信息: 2017/11/27,Check Point 软件技术部门报告了一个华为 HG532 产品的远程命令执行漏洞(CVE-2017-17215),Mirai的升级版变种中已经使用该漏洞.看 ...

  7. Elasticsearch 之 query与filter区别

    转载: http://xiaorui.cc/category/elasticsearch/ http://blog.csdn.net/asia_kobe/article/details/5056301 ...

  8. Java 学习之网络编程案例

    网络编程案例 一,概念 1,网络编程不等于网站编程 2,编程只和传输层打交道,即TCP和UDP两个协议 二,案例 1,TCP实现点对点的聊天 Server端:两个输入流:读客户端和控制台,一个输出端: ...

  9. zabbix自定义监控项一

    1.在agent端配置 1.1 添加自定义监控项 zabbix中监控项叫做item,监控项的取值方法叫做key item: Items是从agnet主机里面获取的所有数据.通常情况下我叫itme为监控 ...

  10. centos 7 查看系统/硬件信息及运维常用命令+联想Y430P无线网卡驱动安装

     centos 7 查看系统/硬件信息及运维常用命令 当前环境:联想Y430P  CentOS 7.3 [root@yan-001 ~] # uname -a # 查看内核/操作系统/CPU信息的Li ...