题目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代码】

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #define MAX 1000005
  5.  
  6. char str[MAX];
  7. char s[MAX*2];
  8. long p[MAX*2];
  9. long len, slen;
  10. long mx, id, mxp;
  11. int t;
  12.  
  13. int main()
  14. {
  15. scanf("%d", &t);
  16. for(int k=0; k<t; k++)
  17. {
  18. scanf("%s", str);
  19. len = strlen(str);
  20. s[0] = '#';
  21. for(long i=0; i<len; i++)
  22. {
  23. s[i*2 + 1] = str[i];
  24. s[i*2 + 2] = '#';
  25. }
  26.  
  27. slen = len*2+1;
  28. id = 0;
  29. mx = 0;
  30. mxp = 0;
  31. memset(p, 0, MAX*sizeof(long));
  32. for(long j=0; j<slen; j++)
  33. {
  34. if(mx > j)
  35. {
  36. p[j] = p[2*id-j]>(mx-j)?(mx-j):p[2*id-j];
  37. }
  38. while(s[j-p[j]]==s[j+p[j]] && (j-p[j]>=0) && (j+p[j]<slen))
  39. p[j]++;
  40.  
  41. if(mxp < p[j]) mxp = p[j];
  42. if(mx < (j+p[j]))
  43. {
  44. id = j;
  45. mx = (j+p[j]);
  46. }
  47. }
  48. printf("%ld\n", mxp-1);
  49. }
  50. return 0;
  51. }

【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. delphi 读取编译的version信息

    在create中调用就可以了 unit About; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, ...

  2. What is Mocking?

    Mocking is primarily used in unit testing. An object under test may have dependencies on other (comp ...

  3. C# 委托、事件,lamda表达式

    参考文章 1. 委托Delegate C#中的Delegate对应于C中的指针,但是又有所不同C中的指针既可以指向方法,又可以指向变量,并且可以进行类型转换, C中的指针实际上就是内存地址变量,他是可 ...

  4. 【java】java反射 Field类的研究使用

    java反射 Field类的研究使用 user.getClass().getFields() 和 user.getClass().getDeclaredFields(); 的区别是什么?

  5. 大量数据更新导致fgc频繁引起jvm服务暂停。

    线上跑的几台server突然出现大量fgc,因为在fgc过程的stop the world太久.引起其他应用訪问该server上的接口大量超时.(发生超时的时间点和fgc时间点一致) 先进行初步的优化 ...

  6. linux:ping不通www.baidu.com

    如果某台Linux服务器ping不通域名, 如下提示: [root@localhost ~]# ping www.baidu.com ping: unknown host www.baidu.com ...

  7. 2017.6.29 移除再导入maven module到IDEA中时提示: Unable to proceed. Nothing found to import.

    解决办法来自:https://stackoverflow.com/questions/18278016/re-importing-modules-into-intellij 场景: 将其中一个modu ...

  8. Node.js 内存泄露 定位

    之前我们在64位Linux服务器上使用Node.js时,当Node进程物理内存接近1.6G,由于谷歌V8引擎对内存的限制,会导致进程退出! 显然我们自身编码或npm加载的第3行模块存在内存泄露问题,那 ...

  9. Intellij idea远程debug连接tomcat,实现单步调试

    转载:http://blog.csdn.net/boling_cavalry/article/details/73384036 web项目部署到tomcat上之后,有时需要打断点单步调试,如果用的是I ...

  10. IOS--苹果各地区开发者支援的电话号码

    网页地址: https://developer.apple.com/contact/phone/ 中国区的咨询热线:4006 701 855 邓白氏申请中心的电话(400-6701855)