hiho 第1周 最长回文子串
题目链接:http://hihocoder.com/problemset/problem/1032
#include <bits/stdc++.h>
using namespace std; bool table[][] = {false}; string longestPalindromeDP(string s)
{
int n = s.length();
int longestBegin = ;
int maxLen = ;
memset(table,,sizeof(table));
for (int i = ; i < n; i++)
table[i][i] = true; //前期的初始化 for (int len = ; len <= n; len++)
{
for (int i = ; i < n-len+; i++)
{
int j = i+len-;
if (s[i] == s[j] && table[i+][j-])
{
table[i][j] = true;
longestBegin = i;
maxLen = len;
}
}
}
return s.substr(longestBegin, maxLen);
} int main()
{
int t;
cin>>t;
while(t--)
{
string str;
cin>>str;
string ans = longestPalindromeDP(str);
cout<<ans.length()<<endl;
}
return ;
}
#include <bits/stdc++.h>
using namespace std; const int maxn = ; char instr[maxn],str[maxn*];
int rad[maxn*]; int Manacher()
{
int i,j,maxx;
int n = strlen(instr);
memset(str,'#',sizeof(str));
for(i=;i<n;i++)
str[(i+)<<] = instr[i]; n = (n+)<<;
str[n] = '$';
int maxRad;
maxRad = j = maxx = ;
for(i = ;i<n;i++)
{
if(i<maxx)
rad[i] = min(rad[*j-i],maxx-i);
else rad[i] = ; while(str[i-rad[i]]==str[i+rad[i]])
rad[i] ++;
if(maxRad<rad[i])
maxRad = rad[i];
if(rad[i]+i>maxx)
{
j = i;
maxx = rad[i] + i;
} }
return maxRad; } int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",instr);
printf("%d\n",Manacher()-);
}
return ;
}
先是用DP写了一下,
DP方程,就是用一个二维数组标记table[i][j] 字符串i,到j是否构成回文串,然后枚举最大长度len,
要是两端相等,并且,可以扩展,那么longestBegin = i,maxlen = len;时间复杂度还是O(n^2),并且数组都开不了。
然后就是Manacher算法:
参考:http://www.cnblogs.com/lv-2012/archive/2012/11/15/2772268.html
先扩充为两倍的字符串,rad[i]表示新的字符串第I个位置可以向左向右匹配的最大距离。求出这个rad数组,有一个结论,rad - 1就是原串对应的位置能匹配的最大长度。
那么怎么求rad数组:
求rad[i] 的时候,如果知道rad 前面的值,还有前面有个位置 ID,能够扩充的最大距离是max,
那么rad = min(rad[2*id-i],max-i);
原因:
当 mx - i > P[j] 的时候,以S[j]为中心的回文子串包含在以S[id]为中心的回文子串中,由于 i 和 j 对称,
以S[i]为中心的回文子串必然包含在以S[id]为中心的回文子串中,所以必有 P[i] = P[j],见下图。
当 P[j] > mx - i 的时候,以S[j]为中心的回文子串不完全包含于以S[id]为中心的回文子串中,但是基于
对称性可知,下图中两个绿框所包围的部分是相同的,也就是说以S[i]为中心的回文子串,其向右至少会
扩张到mx的位置,也就是说 P[i] >= mx - i。至于mx之后的部分是否对称,就只能老老实实去匹配了。
hiho 第1周 最长回文子串的更多相关文章
- hiho一下 第一周 最长回文子串
时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这 ...
- hiho一下第一周 最长回文子串
题目链接:http://hihocoder.com/contest/hiho1/problem/1 #include <iostream> #include <cstdio> ...
- 【hiho一下】第一周 最长回文子串
题目1:最长回文子串 题目原文:http://hihocoder.com/contest/hiho1/problem/1 [题目解读] 题目与 POJ 3974 palindrome 基本同样.求解最 ...
- 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)记录 ...
- hiho #1032: 最长回文子串
#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...
- HiHo 1032 最长回文子串 (Manacher算法求解)
/** * 求解最长回文字串,Manacher算法o(n)求解最长回文子串问题 **/ #include<cstdio> #include<cstdlib> #include& ...
- 最长回文子串-LeetCode 5 Longest Palindromic Substring
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 最长回文子串(Longest Palindromic Substring)
这算是一道经典的题目了,最长回文子串问题是在一个字符串中求得满足回文子串条件的最长的那一个.常见的解题方法有三种: (1)暴力枚举法,以每个元素为中心同时向左和向右出发,复杂度O(n^2): (2)动 ...
随机推荐
- Java中几种日志方案
.本文记录Java中几种常用的日志解决方案 0x01 Log4j .这应该是一个比较老牌的日志方案了,配置也比较简单,步骤如下 1)添加对应依赖,比如 Gradle 中 dependencies { ...
- 树形DP(简单题)(Y HDU4705)
题意:给出一个n个节点的树形图,统计{A,B,C}的数量,其中ABC分别是树上三个不同的节点,并且这三个节点不能被一条路径覆盖 分析:对于下图 进行dfs深搜统计,num[u]统计回溯到当前节点u,并 ...
- 2-sat(and,or,xor)poj3678
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7949 Accepted: 2914 Descr ...
- csuoj 1395: Timebomb
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1395 1395: Timebomb Time Limit: 1 Sec Memory Limit ...
- ruby的在ubuntu上的安装
apt (Debian or Ubuntu) Debian GNU/Linux and Ubuntu use the apt package manager. You can use it like ...
- C++之路起航——标准模板库(list)
list(链表):http://baike.baidu.com/link?url=gkVdBlHEzy6ssrgT5Iy2wze4jl37ka1G45TRpUHrQSYFZQg2HimtUCePV0t ...
- PHP上传图片时,如何判断上传的文件是否为可用的图片文件
利用getimagesize函数: function isImage($filename){$types = '.gif|.jpeg|.png|.bmp';//定义检查的图片类型if(file_exi ...
- kafka监控工具kafkaOffsetMoniter的使用
简介 KafkaOffsetMonitor是由Kafka开源社区提供的一款Web管理界面,用来实时监控Kafka的Consumer以及Partition中的Offset,可以在web界面直观的看到每个 ...
- PAT乙级 1011. A+B和C (15)
1011. A+B和C (15) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 HOU, Qiming 给定区间[-231, 231 ...
- small details
1.操作数据时,一般能入库就入库,或者用xml文件,用文件操作比较复杂