【hiho一下】第一周 最长回文子串
题目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一下】第一周 最长回文子串的更多相关文章
- hiho一下 第一周 最长回文子串
时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这 ...
- hiho一下第一周 最长回文子串
题目链接:http://hihocoder.com/contest/hiho1/problem/1 #include <iostream> #include <cstdio> ...
- hiho 第1周 最长回文子串
题目链接:http://hihocoder.com/problemset/problem/1032 #include <bits/stdc++.h> using namespace std ...
- hihoCoder第一周---最长回文子串(1032)
其实这就是mancher算法的板子题,贴个代码好了. 思想请见我的另一篇博客: https://blog.csdn.net/qq_41090676/article/details/86768361 # ...
- hihoCoder hiho一下 第一周 #1032 : 最长回文子串 (Manacher)
题意:给一个字符串,求最长回文子串的长度. 思路: (1)暴力穷举.O(n^3) -----绝对不行. 穷举所有可能的出现子串O(n^2),再判断是否回文O(n).就是O(n*n*n)了. (2)记录 ...
- hihocoder 第一周 最长回文字串
题目1 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程 ...
- hiho #1032: 最长回文子串
#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...
- HiHo 1032 最长回文子串 (Manacher算法求解)
/** * 求解最长回文字串,Manacher算法o(n)求解最长回文子串问题 **/ #include<cstdio> #include<cstdlib> #include& ...
- Manacher's algorithm: 最长回文子串算法
Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...
随机推荐
- iOS开发之字符串比较
Object-c中比较两个字符串是否相等时,应该用isEqualToString:而不能仅仅只是比较字符串的指针值. NSString *str1=@"hello 1"; NSS ...
- 设计模式之模板模式(PHP实现)
github地址:https://github.com/ZQCard/design_pattern * 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板. ...
- OpenGL.Vertex Array Object (VAO) 【转】
http://www.cppblog.com/init/archive/2012/02/21/166098.html 一 OpenGL抛弃glEnable(),glColor(),glVertex() ...
- sql中用JOIN USING 简化JOIN ON
Mysql 中联接SQL语句中,ON子句的语法格式为:table1.column_name = table2.column_name. 当模式设计对联接表的列采用了相同的命名样式时,就可以使用 USI ...
- 机器学习&深度学习资料(转载)
转自 飞鸟各投林 <Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboo ...
- 大量数据更新导致fgc频繁引起jvm服务暂停。
线上跑的几台server突然出现大量fgc,因为在fgc过程的stop the world太久.引起其他应用訪问该server上的接口大量超时.(发生超时的时间点和fgc时间点一致) 先进行初步的优化 ...
- phpMyAdmin搭建及管理多台数据库服务器
phpMyAdmin搭建及管理多台数据库服务器 环境说明: 系统版本 CentOS 6.9 x86_64 软件版本 nginx-1.12.2 php-5.5. ...
- 错误:“The requested resource () is not available.”的处置
做网页过程中,某页需要以新窗方式打开另一个网页,于是url是这样写: pages/test/transw/claimer.html 但是,点链接后网页提示 The requested resource ...
- 不得不看的Java代码性能优化总结
原文:https://blog.csdn.net/mr_smile2014/article/details/50112723 前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么 ...
- 优化MyDb
import pymysqlclass MyDb(object): #新式类 def __del__(self):#析构函数 self.cur.close() self.coon.close() pr ...